package org.eclipse.qvtd.xtext.qvtimperative.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.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.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess;



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, 2021 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
@SuppressWarnings("all")
public class InternalQVTimperativeParser extends org.eclipse.ocl.xtext.base.utilities.CompatibilityAbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_SINGLE_QUOTED_STRING", "RULE_UNQUOTED_STRING", "RULE_INT", "RULE_SIMPLE_ID", "RULE_ESCAPED_ID", "RULE_ESCAPED_CHARACTER", "RULE_LETTER_CHARACTER", "RULE_DOUBLE_QUOTED_STRING", "RULE_ML_SINGLE_QUOTED_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'observe'", "','", "'add'", "'+='", "';'", "'appendsTo'", "'append'", "':'", "'strict'", "'buffer'", "'..'", "':='", "'check'", "'var'", "'imports'", "'entry'", "'input'", "'output'", "'{'", "'}'", "'consumes'", "'guard'", "'success'", "'import'", "'::'", "'*'", "'iterates'", "'map'", "'call'", "'install'", "'invoke'", "'for'", "'in'", "'contained'", "'new'", "'package'", "'='", "'transient'", "'query'", "'('", "')'", "'implementedby'", "'notify'", "'set'", "'.'", "'uses'", "'speculate'", "'transformation'", "'target'", "'via'", "'static'", "'definition'", "'attribute'", "'derived'", "'!derived'", "'id'", "'!id'", "'ordered'", "'!ordered'", "'readonly'", "'!readonly'", "'!transient'", "'unique'", "'!unique'", "'unsettable'", "'!unsettable'", "'volatile'", "'!volatile'", "'initial'", "'derivation'", "'primitive'", "'datatype'", "'serializable'", "'!serializable'", "'enum'", "'literal'", "'operation'", "'throws'", "'body'", "'property'", "'#'", "'composes'", "'!composes'", "'resolve'", "'!resolve'", "'abstract'", "'class'", "'extends'", "'interface'", "'-'", "'not'", "'not2'", "'/'", "'+'", "'>'", "'<'", "'>='", "'<='", "'<>'", "'and'", "'and2'", "'implies'", "'implies2'", "'or'", "'or2'", "'xor'", "'xor2'", "'->'", "'?.'", "'?->'", "'Map'", "'Tuple'", "'Boolean'", "'Integer'", "'Real'", "'String'", "'UnlimitedNatural'", "'OclAny'", "'OclInvalid'", "'OclVoid'", "'Set'", "'Bag'", "'Sequence'", "'Collection'", "'OrderedSet'", "'++'", "'Lambda'", "'<-'", "'true'", "'false'", "'invalid'", "'null'", "'@'", "'pre'", "'['", "']'", "'|'", "'if'", "'then'", "'else'", "'endif'", "'elseif'", "'let'", "'self'", "'|?'", "'|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 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 T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=13;
    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__162=162;
    public static final int T__161=161;
    public static final int T__164=164;
    public static final int T__163=163;
    public static final int T__160=160;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__159=159;
    public static final int T__30=30;
    public static final int T__158=158;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__155=155;
    public static final int T__154=154;
    public static final int T__157=157;
    public static final int T__156=156;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    public static final int RULE_SINGLE_QUOTED_STRING=4;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int RULE_DOUBLE_QUOTED_STRING=11;
    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 RULE_ESCAPED_ID=8;
    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 RULE_LETTER_CHARACTER=10;
    public static final int T__19=19;
    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 RULE_ESCAPED_CHARACTER=9;
    public static final int T__95=95;
    public static final int RULE_ML_SINGLE_QUOTED_STRING=12;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int T__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_UNQUOTED_STRING=5;
    public static final int RULE_SL_COMMENT=14;
    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 RULE_SIMPLE_ID=7;
    public static final int T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=15;
    public static final int RULE_ANY_OTHER=16;
    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 InternalQVTimperativeParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalQVTimperativeParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);

        }


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



    /*
      This grammar contains a lot of empty actions to work around a bug in ANTLR.
      Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
    */

     	private QVTimperativeGrammarAccess grammarAccess;

        public InternalQVTimperativeParser(TokenStream input, QVTimperativeGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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



    // $ANTLR start "entryRuleTopLevelCS"
    // InternalQVTimperative.g:80:1: entryRuleTopLevelCS returns [EObject current=null] : iv_ruleTopLevelCS= ruleTopLevelCS EOF ;
    public final EObject entryRuleTopLevelCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTopLevelCS = null;


        try {
            // InternalQVTimperative.g:81:2: (iv_ruleTopLevelCS= ruleTopLevelCS EOF )
            // InternalQVTimperative.g:82:2: iv_ruleTopLevelCS= ruleTopLevelCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTopLevelCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTopLevelCS=ruleTopLevelCS();

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

            }

        }

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


    // $ANTLR start "ruleTopLevelCS"
    // InternalQVTimperative.g:89:1: ruleTopLevelCS returns [EObject current=null] : ( ( (lv_ownedImports_0_0= ruleImportCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* ) ;
    public final EObject ruleTopLevelCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedImports_0_0 = null;

        EObject lv_ownedPackages_1_0 = null;

        EObject lv_ownedTransformations_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:92:28: ( ( ( (lv_ownedImports_0_0= ruleImportCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* ) )
            // InternalQVTimperative.g:93:1: ( ( (lv_ownedImports_0_0= ruleImportCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* )
            {
            // InternalQVTimperative.g:93:1: ( ( (lv_ownedImports_0_0= ruleImportCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* )
            // InternalQVTimperative.g:93:2: ( (lv_ownedImports_0_0= ruleImportCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )*
            {
            // InternalQVTimperative.g:93:2: ( (lv_ownedImports_0_0= ruleImportCS ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

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


                switch (alt1) {
            	case 1 :
            	    // InternalQVTimperative.g:94:1: (lv_ownedImports_0_0= ruleImportCS )
            	    {
            	    // InternalQVTimperative.g:94:1: (lv_ownedImports_0_0= ruleImportCS )
            	    // InternalQVTimperative.g:95:3: lv_ownedImports_0_0= ruleImportCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedImportsImportCSParserRuleCall_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_3);
            	    lv_ownedImports_0_0=ruleImportCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedImports",
            	              		lv_ownedImports_0_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ImportCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:111:3: ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )*
            loop2:
            do {
                int alt2=3;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==52) ) {
                    alt2=1;
                }
                else if ( (LA2_0==64) ) {
                    alt2=2;
                }


                switch (alt2) {
            	case 1 :
            	    // InternalQVTimperative.g:111:4: ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) )
            	    {
            	    // InternalQVTimperative.g:111:4: ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) )
            	    // InternalQVTimperative.g:112:1: (lv_ownedPackages_1_0= ruleQualifiedPackageCS )
            	    {
            	    // InternalQVTimperative.g:112:1: (lv_ownedPackages_1_0= ruleQualifiedPackageCS )
            	    // InternalQVTimperative.g:113:3: lv_ownedPackages_1_0= ruleQualifiedPackageCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedPackagesQualifiedPackageCSParserRuleCall_1_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_ownedPackages_1_0=ruleQualifiedPackageCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedPackages",
            	              		lv_ownedPackages_1_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.QualifiedPackageCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalQVTimperative.g:130:6: ( (lv_ownedTransformations_2_0= ruleTransformationCS ) )
            	    {
            	    // InternalQVTimperative.g:130:6: ( (lv_ownedTransformations_2_0= ruleTransformationCS ) )
            	    // InternalQVTimperative.g:131:1: (lv_ownedTransformations_2_0= ruleTransformationCS )
            	    {
            	    // InternalQVTimperative.g:131:1: (lv_ownedTransformations_2_0= ruleTransformationCS )
            	    // InternalQVTimperative.g:132:3: lv_ownedTransformations_2_0= ruleTransformationCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedTransformationsTransformationCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_ownedTransformations_2_0=ruleTransformationCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedTransformations",
            	              		lv_ownedTransformations_2_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.TransformationCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleAddStatementCS"
    // InternalQVTimperative.g:156:1: entryRuleAddStatementCS returns [EObject current=null] : iv_ruleAddStatementCS= ruleAddStatementCS EOF ;
    public final EObject entryRuleAddStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAddStatementCS = null;


        try {
            // InternalQVTimperative.g:157:2: (iv_ruleAddStatementCS= ruleAddStatementCS EOF )
            // InternalQVTimperative.g:158:2: iv_ruleAddStatementCS= ruleAddStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAddStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAddStatementCS=ruleAddStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleAddStatementCS"
    // InternalQVTimperative.g:165:1: ruleAddStatementCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'add' ( ( ruleUnrestrictedName ) ) otherlv_6= '+=' ( (lv_ownedExpression_7_0= ruleExpCS ) ) otherlv_8= ';' ) ;
    public final EObject ruleAddStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        EObject lv_ownedExpression_7_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:168:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'add' ( ( ruleUnrestrictedName ) ) otherlv_6= '+=' ( (lv_ownedExpression_7_0= ruleExpCS ) ) otherlv_8= ';' ) )
            // InternalQVTimperative.g:169:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'add' ( ( ruleUnrestrictedName ) ) otherlv_6= '+=' ( (lv_ownedExpression_7_0= ruleExpCS ) ) otherlv_8= ';' )
            {
            // InternalQVTimperative.g:169:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'add' ( ( ruleUnrestrictedName ) ) otherlv_6= '+=' ( (lv_ownedExpression_7_0= ruleExpCS ) ) otherlv_8= ';' )
            // InternalQVTimperative.g:169:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'add' ( ( ruleUnrestrictedName ) ) otherlv_6= '+=' ( (lv_ownedExpression_7_0= ruleExpCS ) ) otherlv_8= ';'
            {
            // InternalQVTimperative.g:169:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==17) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalQVTimperative.g:169:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getAddStatementCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:173:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:174:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:174:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:175:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getAddStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_6);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getAddStatementCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:191:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop3:
                    do {
                        int alt3=2;
                        int LA3_0 = input.LA(1);

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


                        switch (alt3) {
                    	case 1 :
                    	    // InternalQVTimperative.g:191:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getAddStatementCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:195:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:196:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:196:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:197:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAddStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_6);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAddStatementCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getAddStatementCSAccess().getAddKeyword_1());

            }
            // InternalQVTimperative.g:217:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:218:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:218:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:219:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getAddStatementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAddStatementCSAccess().getTargetVariableConnectionVariableCrossReference_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_7);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_6, grammarAccess.getAddStatementCSAccess().getPlusSignEqualsSignKeyword_3());

            }
            // InternalQVTimperative.g:239:1: ( (lv_ownedExpression_7_0= ruleExpCS ) )
            // InternalQVTimperative.g:240:1: (lv_ownedExpression_7_0= ruleExpCS )
            {
            // InternalQVTimperative.g:240:1: (lv_ownedExpression_7_0= ruleExpCS )
            // InternalQVTimperative.g:241:3: lv_ownedExpression_7_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAddStatementCSAccess().getOwnedExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedExpression_7_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getAddStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedExpression",
                      		lv_ownedExpression_7_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_8, grammarAccess.getAddStatementCSAccess().getSemicolonKeyword_5());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleAppendParameterBindingCS"
    // InternalQVTimperative.g:269:1: entryRuleAppendParameterBindingCS returns [EObject current=null] : iv_ruleAppendParameterBindingCS= ruleAppendParameterBindingCS EOF ;
    public final EObject entryRuleAppendParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAppendParameterBindingCS = null;


        try {
            // InternalQVTimperative.g:270:2: (iv_ruleAppendParameterBindingCS= ruleAppendParameterBindingCS EOF )
            // InternalQVTimperative.g:271:2: iv_ruleAppendParameterBindingCS= ruleAppendParameterBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAppendParameterBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAppendParameterBindingCS=ruleAppendParameterBindingCS();

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

            }

        }

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


    // $ANTLR start "ruleAppendParameterBindingCS"
    // InternalQVTimperative.g:278:1: ruleAppendParameterBindingCS returns [EObject current=null] : ( ( ( ruleUnrestrictedName ) ) otherlv_1= 'appendsTo' ( ( ruleUnrestrictedName ) ) otherlv_3= ';' ) ;
    public final EObject ruleAppendParameterBindingCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;

         enterRule();

        try {
            // InternalQVTimperative.g:281:28: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= 'appendsTo' ( ( ruleUnrestrictedName ) ) otherlv_3= ';' ) )
            // InternalQVTimperative.g:282:1: ( ( ( ruleUnrestrictedName ) ) otherlv_1= 'appendsTo' ( ( ruleUnrestrictedName ) ) otherlv_3= ';' )
            {
            // InternalQVTimperative.g:282:1: ( ( ( ruleUnrestrictedName ) ) otherlv_1= 'appendsTo' ( ( ruleUnrestrictedName ) ) otherlv_3= ';' )
            // InternalQVTimperative.g:282:2: ( ( ruleUnrestrictedName ) ) otherlv_1= 'appendsTo' ( ( ruleUnrestrictedName ) ) otherlv_3= ';'
            {
            // InternalQVTimperative.g:282:2: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:283:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:283:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:284:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getAppendParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAppendParameterBindingCSAccess().getReferredVariableAppendParameterCrossReference_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_10);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getAppendParameterBindingCSAccess().getAppendsToKeyword_1());

            }
            // InternalQVTimperative.g:304:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:305:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:305:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:306:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getAppendParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAppendParameterBindingCSAccess().getValueConnectionVariableCrossReference_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_3, grammarAccess.getAppendParameterBindingCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleAppendParameterCS"
    // InternalQVTimperative.g:334:1: entryRuleAppendParameterCS returns [EObject current=null] : iv_ruleAppendParameterCS= ruleAppendParameterCS EOF ;
    public final EObject entryRuleAppendParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAppendParameterCS = null;


        try {
            // InternalQVTimperative.g:335:2: (iv_ruleAppendParameterCS= ruleAppendParameterCS EOF )
            // InternalQVTimperative.g:336:2: iv_ruleAppendParameterCS= ruleAppendParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAppendParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAppendParameterCS=ruleAppendParameterCS();

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

            }

        }

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


    // $ANTLR start "ruleAppendParameterCS"
    // InternalQVTimperative.g:343:1: ruleAppendParameterCS returns [EObject current=null] : (otherlv_0= 'append' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) otherlv_4= ';' ) ;
    public final EObject ruleAppendParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedType_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:346:28: ( (otherlv_0= 'append' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) otherlv_4= ';' ) )
            // InternalQVTimperative.g:347:1: (otherlv_0= 'append' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) otherlv_4= ';' )
            {
            // InternalQVTimperative.g:347:1: (otherlv_0= 'append' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) otherlv_4= ';' )
            // InternalQVTimperative.g:347:3: otherlv_0= 'append' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) otherlv_4= ';'
            {
            otherlv_0=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getAppendParameterCSAccess().getAppendKeyword_0());

            }
            // InternalQVTimperative.g:351:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:352:1: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:352:1: (lv_name_1_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:353:3: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAppendParameterCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_1_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getAppendParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_1_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_2, grammarAccess.getAppendParameterCSAccess().getColonKeyword_2());

            }
            // InternalQVTimperative.g:373:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:374:1: (lv_ownedType_3_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:374:1: (lv_ownedType_3_0= ruleTypeExpCS )
            // InternalQVTimperative.g:375:3: lv_ownedType_3_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAppendParameterCSAccess().getOwnedTypeTypeExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedType_3_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getAppendParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_3_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getAppendParameterCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleBufferStatementCS"
    // InternalQVTimperative.g:403:1: entryRuleBufferStatementCS returns [EObject current=null] : iv_ruleBufferStatementCS= ruleBufferStatementCS EOF ;
    public final EObject entryRuleBufferStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBufferStatementCS = null;


        try {
            // InternalQVTimperative.g:404:2: (iv_ruleBufferStatementCS= ruleBufferStatementCS EOF )
            // InternalQVTimperative.g:405:2: iv_ruleBufferStatementCS= ruleBufferStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBufferStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBufferStatementCS=ruleBufferStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleBufferStatementCS"
    // InternalQVTimperative.g:412:1: ruleBufferStatementCS returns [EObject current=null] : ( ( (lv_isStrict_0_0= 'strict' ) )? otherlv_1= 'buffer' (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )? ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )? otherlv_11= ';' ) ;
    public final EObject ruleBufferStatementCS() throws RecognitionException {
        EObject current = null;

        Token lv_isStrict_0_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_firstPass_3_0 = null;

        AntlrDatatypeRuleToken lv_lastPass_5_0 = null;

        AntlrDatatypeRuleToken lv_name_6_0 = null;

        EObject lv_ownedType_8_0 = null;

        EObject lv_ownedExpression_10_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:415:28: ( ( ( (lv_isStrict_0_0= 'strict' ) )? otherlv_1= 'buffer' (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )? ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )? otherlv_11= ';' ) )
            // InternalQVTimperative.g:416:1: ( ( (lv_isStrict_0_0= 'strict' ) )? otherlv_1= 'buffer' (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )? ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )? otherlv_11= ';' )
            {
            // InternalQVTimperative.g:416:1: ( ( (lv_isStrict_0_0= 'strict' ) )? otherlv_1= 'buffer' (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )? ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )? otherlv_11= ';' )
            // InternalQVTimperative.g:416:2: ( (lv_isStrict_0_0= 'strict' ) )? otherlv_1= 'buffer' (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )? ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )? otherlv_11= ';'
            {
            // InternalQVTimperative.g:416:2: ( (lv_isStrict_0_0= 'strict' ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==25) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // InternalQVTimperative.g:417:1: (lv_isStrict_0_0= 'strict' )
                    {
                    // InternalQVTimperative.g:417:1: (lv_isStrict_0_0= 'strict' )
                    // InternalQVTimperative.g:418:3: lv_isStrict_0_0= 'strict'
                    {
                    lv_isStrict_0_0=(Token)match(input,25,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isStrict_0_0, grammarAccess.getBufferStatementCSAccess().getIsStrictStrictKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getBufferStatementCSRule());
                      	        }
                             		setWithLastConsumed(current, "isStrict", true, "strict");

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getBufferStatementCSAccess().getBufferKeyword_1());

            }
            // InternalQVTimperative.g:435:1: (otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )? )?
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==24) ) {
                alt7=1;
            }
            switch (alt7) {
                case 1 :
                    // InternalQVTimperative.g:435:3: otherlv_2= ':' ( (lv_firstPass_3_0= ruleLOWER ) ) (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )?
                    {
                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getBufferStatementCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTimperative.g:439:1: ( (lv_firstPass_3_0= ruleLOWER ) )
                    // InternalQVTimperative.g:440:1: (lv_firstPass_3_0= ruleLOWER )
                    {
                    // InternalQVTimperative.g:440:1: (lv_firstPass_3_0= ruleLOWER )
                    // InternalQVTimperative.g:441:3: lv_firstPass_3_0= ruleLOWER
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getBufferStatementCSAccess().getFirstPassLOWERParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_16);
                    lv_firstPass_3_0=ruleLOWER();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getBufferStatementCSRule());
                      	        }
                             		set(
                             			current,
                             			"firstPass",
                              		lv_firstPass_3_0,
                              		"org.eclipse.ocl.xtext.base.Base.LOWER");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:457:2: (otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) ) )?
                    int alt6=2;
                    int LA6_0 = input.LA(1);

                    if ( (LA6_0==27) ) {
                        alt6=1;
                    }
                    switch (alt6) {
                        case 1 :
                            // InternalQVTimperative.g:457:4: otherlv_4= '..' ( (lv_lastPass_5_0= ruleLOWER ) )
                            {
                            otherlv_4=(Token)match(input,27,FollowSets000.FOLLOW_15); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getBufferStatementCSAccess().getFullStopFullStopKeyword_2_2_0());

                            }
                            // InternalQVTimperative.g:461:1: ( (lv_lastPass_5_0= ruleLOWER ) )
                            // InternalQVTimperative.g:462:1: (lv_lastPass_5_0= ruleLOWER )
                            {
                            // InternalQVTimperative.g:462:1: (lv_lastPass_5_0= ruleLOWER )
                            // InternalQVTimperative.g:463:3: lv_lastPass_5_0= ruleLOWER
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getBufferStatementCSAccess().getLastPassLOWERParserRuleCall_2_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_5);
                            lv_lastPass_5_0=ruleLOWER();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getBufferStatementCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"lastPass",
                                      		lv_lastPass_5_0,
                                      		"org.eclipse.ocl.xtext.base.Base.LOWER");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:479:6: ( (lv_name_6_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:480:1: (lv_name_6_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:480:1: (lv_name_6_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:481:3: lv_name_6_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getBufferStatementCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_17);
            lv_name_6_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getBufferStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_6_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:497:2: (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==24) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // InternalQVTimperative.g:497:4: otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) )
                    {
                    otherlv_7=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getBufferStatementCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTimperative.g:501:1: ( (lv_ownedType_8_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:502:1: (lv_ownedType_8_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:502:1: (lv_ownedType_8_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:503:3: lv_ownedType_8_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getBufferStatementCSAccess().getOwnedTypeTypeExpCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_18);
                    lv_ownedType_8_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getBufferStatementCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_8_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:519:4: (otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) )?
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==28) ) {
                alt9=1;
            }
            switch (alt9) {
                case 1 :
                    // InternalQVTimperative.g:519:6: otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) )
                    {
                    otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getBufferStatementCSAccess().getColonEqualsSignKeyword_5_0());

                    }
                    // InternalQVTimperative.g:523:1: ( (lv_ownedExpression_10_0= ruleExpCS ) )
                    // InternalQVTimperative.g:524:1: (lv_ownedExpression_10_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:524:1: (lv_ownedExpression_10_0= ruleExpCS )
                    // InternalQVTimperative.g:525:3: lv_ownedExpression_10_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getBufferStatementCSAccess().getOwnedExpressionExpCSParserRuleCall_5_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_9);
                    lv_ownedExpression_10_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getBufferStatementCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_10_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_11, grammarAccess.getBufferStatementCSAccess().getSemicolonKeyword_6());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCommitStatementCS"
    // InternalQVTimperative.g:553:1: entryRuleCommitStatementCS returns [EObject current=null] : iv_ruleCommitStatementCS= ruleCommitStatementCS EOF ;
    public final EObject entryRuleCommitStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCommitStatementCS = null;


        try {
            // InternalQVTimperative.g:554:2: (iv_ruleCommitStatementCS= ruleCommitStatementCS EOF )
            // InternalQVTimperative.g:555:2: iv_ruleCommitStatementCS= ruleCommitStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCommitStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCommitStatementCS=ruleCommitStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleCommitStatementCS"
    // InternalQVTimperative.g:562:1: ruleCommitStatementCS returns [EObject current=null] : (this_NewStatementCS_0= ruleNewStatementCS | this_SetStatementCS_1= ruleSetStatementCS ) ;
    public final EObject ruleCommitStatementCS() throws RecognitionException {
        EObject current = null;

        EObject this_NewStatementCS_0 = null;

        EObject this_SetStatementCS_1 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:565:28: ( (this_NewStatementCS_0= ruleNewStatementCS | this_SetStatementCS_1= ruleSetStatementCS ) )
            // InternalQVTimperative.g:566:1: (this_NewStatementCS_0= ruleNewStatementCS | this_SetStatementCS_1= ruleSetStatementCS )
            {
            // InternalQVTimperative.g:566:1: (this_NewStatementCS_0= ruleNewStatementCS | this_SetStatementCS_1= ruleSetStatementCS )
            int alt10=2;
            alt10 = dfa10.predict(input);
            switch (alt10) {
                case 1 :
                    // InternalQVTimperative.g:567:2: this_NewStatementCS_0= ruleNewStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getCommitStatementCSAccess().getNewStatementCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NewStatementCS_0=ruleNewStatementCS();

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

                              current = this_NewStatementCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:580:2: this_SetStatementCS_1= ruleSetStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getCommitStatementCSAccess().getSetStatementCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SetStatementCS_1=ruleSetStatementCS();

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

                              current = this_SetStatementCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCheckStatementCS"
    // InternalQVTimperative.g:599:1: entryRuleCheckStatementCS returns [EObject current=null] : iv_ruleCheckStatementCS= ruleCheckStatementCS EOF ;
    public final EObject entryRuleCheckStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCheckStatementCS = null;


        try {
            // InternalQVTimperative.g:600:2: (iv_ruleCheckStatementCS= ruleCheckStatementCS EOF )
            // InternalQVTimperative.g:601:2: iv_ruleCheckStatementCS= ruleCheckStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCheckStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCheckStatementCS=ruleCheckStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleCheckStatementCS"
    // InternalQVTimperative.g:608:1: ruleCheckStatementCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'check' ( (lv_ownedCondition_5_0= ruleExpCS ) ) otherlv_6= ';' ) ;
    public final EObject ruleCheckStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        EObject lv_ownedCondition_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:611:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'check' ( (lv_ownedCondition_5_0= ruleExpCS ) ) otherlv_6= ';' ) )
            // InternalQVTimperative.g:612:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'check' ( (lv_ownedCondition_5_0= ruleExpCS ) ) otherlv_6= ';' )
            {
            // InternalQVTimperative.g:612:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'check' ( (lv_ownedCondition_5_0= ruleExpCS ) ) otherlv_6= ';' )
            // InternalQVTimperative.g:612:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'check' ( (lv_ownedCondition_5_0= ruleExpCS ) ) otherlv_6= ';'
            {
            // InternalQVTimperative.g:612:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( (LA12_0==17) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // InternalQVTimperative.g:612:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getCheckStatementCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:616:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:617:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:617:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:618:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCheckStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_19);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCheckStatementCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:634:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop11:
                    do {
                        int alt11=2;
                        int LA11_0 = input.LA(1);

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


                        switch (alt11) {
                    	case 1 :
                    	    // InternalQVTimperative.g:634:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getCheckStatementCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:638:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:639:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:639:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:640:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCheckStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_19);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getCheckStatementCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_4=(Token)match(input,29,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getCheckStatementCSAccess().getCheckKeyword_1());

            }
            // InternalQVTimperative.g:660:1: ( (lv_ownedCondition_5_0= ruleExpCS ) )
            // InternalQVTimperative.g:661:1: (lv_ownedCondition_5_0= ruleExpCS )
            {
            // InternalQVTimperative.g:661:1: (lv_ownedCondition_5_0= ruleExpCS )
            // InternalQVTimperative.g:662:3: lv_ownedCondition_5_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCheckStatementCSAccess().getOwnedConditionExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedCondition_5_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCheckStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedCondition",
                      		lv_ownedCondition_5_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_6, grammarAccess.getCheckStatementCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleControlStatementCS"
    // InternalQVTimperative.g:690:1: entryRuleControlStatementCS returns [EObject current=null] : iv_ruleControlStatementCS= ruleControlStatementCS EOF ;
    public final EObject entryRuleControlStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleControlStatementCS = null;


        try {
            // InternalQVTimperative.g:691:2: (iv_ruleControlStatementCS= ruleControlStatementCS EOF )
            // InternalQVTimperative.g:692:2: iv_ruleControlStatementCS= ruleControlStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getControlStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleControlStatementCS=ruleControlStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleControlStatementCS"
    // InternalQVTimperative.g:699:1: ruleControlStatementCS returns [EObject current=null] : (this_AddStatementCS_0= ruleAddStatementCS | this_MappingCallCS_1= ruleMappingCallCS | this_MappingLoopCS_2= ruleMappingLoopCS ) ;
    public final EObject ruleControlStatementCS() throws RecognitionException {
        EObject current = null;

        EObject this_AddStatementCS_0 = null;

        EObject this_MappingCallCS_1 = null;

        EObject this_MappingLoopCS_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:702:28: ( (this_AddStatementCS_0= ruleAddStatementCS | this_MappingCallCS_1= ruleMappingCallCS | this_MappingLoopCS_2= ruleMappingLoopCS ) )
            // InternalQVTimperative.g:703:1: (this_AddStatementCS_0= ruleAddStatementCS | this_MappingCallCS_1= ruleMappingCallCS | this_MappingLoopCS_2= ruleMappingLoopCS )
            {
            // InternalQVTimperative.g:703:1: (this_AddStatementCS_0= ruleAddStatementCS | this_MappingCallCS_1= ruleMappingCallCS | this_MappingLoopCS_2= ruleMappingLoopCS )
            int alt13=3;
            alt13 = dfa13.predict(input);
            switch (alt13) {
                case 1 :
                    // InternalQVTimperative.g:704:2: this_AddStatementCS_0= ruleAddStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getControlStatementCSAccess().getAddStatementCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AddStatementCS_0=ruleAddStatementCS();

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

                              current = this_AddStatementCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:717:2: this_MappingCallCS_1= ruleMappingCallCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getControlStatementCSAccess().getMappingCallCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MappingCallCS_1=ruleMappingCallCS();

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

                              current = this_MappingCallCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:730:2: this_MappingLoopCS_2= ruleMappingLoopCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getControlStatementCSAccess().getMappingLoopCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MappingLoopCS_2=ruleMappingLoopCS();

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

                              current = this_MappingLoopCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleDeclareStatementCS"
    // InternalQVTimperative.g:749:1: entryRuleDeclareStatementCS returns [EObject current=null] : iv_ruleDeclareStatementCS= ruleDeclareStatementCS EOF ;
    public final EObject entryRuleDeclareStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDeclareStatementCS = null;


        try {
            // InternalQVTimperative.g:750:2: (iv_ruleDeclareStatementCS= ruleDeclareStatementCS EOF )
            // InternalQVTimperative.g:751:2: iv_ruleDeclareStatementCS= ruleDeclareStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDeclareStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDeclareStatementCS=ruleDeclareStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleDeclareStatementCS"
    // InternalQVTimperative.g:758:1: ruleDeclareStatementCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isCheck_4_0= 'check' ) )? otherlv_5= 'var' ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) otherlv_11= ';' ) ;
    public final EObject ruleDeclareStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_isCheck_4_0=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        AntlrDatatypeRuleToken lv_name_6_0 = null;

        EObject lv_ownedType_8_0 = null;

        EObject lv_ownedExpression_10_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:761:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isCheck_4_0= 'check' ) )? otherlv_5= 'var' ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) otherlv_11= ';' ) )
            // InternalQVTimperative.g:762:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isCheck_4_0= 'check' ) )? otherlv_5= 'var' ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) otherlv_11= ';' )
            {
            // InternalQVTimperative.g:762:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isCheck_4_0= 'check' ) )? otherlv_5= 'var' ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) otherlv_11= ';' )
            // InternalQVTimperative.g:762:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isCheck_4_0= 'check' ) )? otherlv_5= 'var' ( (lv_name_6_0= ruleUnrestrictedName ) ) (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )? otherlv_9= ':=' ( (lv_ownedExpression_10_0= ruleExpCS ) ) otherlv_11= ';'
            {
            // InternalQVTimperative.g:762:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==17) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // InternalQVTimperative.g:762:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getDeclareStatementCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:766:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:767:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:767:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:768:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDeclareStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_20);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDeclareStatementCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:784:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop14:
                    do {
                        int alt14=2;
                        int LA14_0 = input.LA(1);

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


                        switch (alt14) {
                    	case 1 :
                    	    // InternalQVTimperative.g:784:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getDeclareStatementCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:788:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:789:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:789:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:790:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getDeclareStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_20);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getDeclareStatementCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:806:6: ( (lv_isCheck_4_0= 'check' ) )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==29) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // InternalQVTimperative.g:807:1: (lv_isCheck_4_0= 'check' )
                    {
                    // InternalQVTimperative.g:807:1: (lv_isCheck_4_0= 'check' )
                    // InternalQVTimperative.g:808:3: lv_isCheck_4_0= 'check'
                    {
                    lv_isCheck_4_0=(Token)match(input,29,FollowSets000.FOLLOW_21); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isCheck_4_0, grammarAccess.getDeclareStatementCSAccess().getIsCheckCheckKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getDeclareStatementCSRule());
                      	        }
                             		setWithLastConsumed(current, "isCheck", true, "check");

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getDeclareStatementCSAccess().getVarKeyword_2());

            }
            // InternalQVTimperative.g:825:1: ( (lv_name_6_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:826:1: (lv_name_6_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:826:1: (lv_name_6_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:827:3: lv_name_6_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getDeclareStatementCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_22);
            lv_name_6_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getDeclareStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_6_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:843:2: (otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) ) )?
            int alt17=2;
            int LA17_0 = input.LA(1);

            if ( (LA17_0==24) ) {
                alt17=1;
            }
            switch (alt17) {
                case 1 :
                    // InternalQVTimperative.g:843:4: otherlv_7= ':' ( (lv_ownedType_8_0= ruleTypeExpCS ) )
                    {
                    otherlv_7=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getDeclareStatementCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTimperative.g:847:1: ( (lv_ownedType_8_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:848:1: (lv_ownedType_8_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:848:1: (lv_ownedType_8_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:849:3: lv_ownedType_8_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDeclareStatementCSAccess().getOwnedTypeTypeExpCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_23);
                    lv_ownedType_8_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDeclareStatementCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_8_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_9, grammarAccess.getDeclareStatementCSAccess().getColonEqualsSignKeyword_5());

            }
            // InternalQVTimperative.g:869:1: ( (lv_ownedExpression_10_0= ruleExpCS ) )
            // InternalQVTimperative.g:870:1: (lv_ownedExpression_10_0= ruleExpCS )
            {
            // InternalQVTimperative.g:870:1: (lv_ownedExpression_10_0= ruleExpCS )
            // InternalQVTimperative.g:871:3: lv_ownedExpression_10_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getDeclareStatementCSAccess().getOwnedExpressionExpCSParserRuleCall_6_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedExpression_10_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getDeclareStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedExpression",
                      		lv_ownedExpression_10_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_11, grammarAccess.getDeclareStatementCSAccess().getSemicolonKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleDirectionCS"
    // InternalQVTimperative.g:899:1: entryRuleDirectionCS returns [EObject current=null] : iv_ruleDirectionCS= ruleDirectionCS EOF ;
    public final EObject entryRuleDirectionCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDirectionCS = null;


        try {
            // InternalQVTimperative.g:900:2: (iv_ruleDirectionCS= ruleDirectionCS EOF )
            // InternalQVTimperative.g:901:2: iv_ruleDirectionCS= ruleDirectionCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDirectionCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDirectionCS=ruleDirectionCS();

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

            }

        }

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


    // $ANTLR start "ruleDirectionCS"
    // InternalQVTimperative.g:908:1: ruleDirectionCS returns [EObject current=null] : ( () ( (lv_name_1_0= ruleIdentifier ) )? (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )? ) ;
    public final EObject ruleDirectionCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:911:28: ( ( () ( (lv_name_1_0= ruleIdentifier ) )? (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )? ) )
            // InternalQVTimperative.g:912:1: ( () ( (lv_name_1_0= ruleIdentifier ) )? (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )? )
            {
            // InternalQVTimperative.g:912:1: ( () ( (lv_name_1_0= ruleIdentifier ) )? (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )? )
            // InternalQVTimperative.g:912:2: () ( (lv_name_1_0= ruleIdentifier ) )? (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )?
            {
            // InternalQVTimperative.g:912:2: ()
            // InternalQVTimperative.g:913:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getDirectionCSAccess().getDirectionCSAction_0(),
                          current);

            }

            }

            // InternalQVTimperative.g:921:2: ( (lv_name_1_0= ruleIdentifier ) )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( ((LA18_0>=RULE_SIMPLE_ID && LA18_0<=RULE_ESCAPED_ID)) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // InternalQVTimperative.g:922:1: (lv_name_1_0= ruleIdentifier )
                    {
                    // InternalQVTimperative.g:922:1: (lv_name_1_0= ruleIdentifier )
                    // InternalQVTimperative.g:923:3: lv_name_1_0= ruleIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDirectionCSAccess().getNameIdentifierParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_24);
                    lv_name_1_0=ruleIdentifier();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDirectionCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.Identifier");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:939:3: (otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )* )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==31) ) {
                alt20=1;
            }
            switch (alt20) {
                case 1 :
                    // InternalQVTimperative.g:939:5: otherlv_2= 'imports' ( ( ruleUnrestrictedName ) ) (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )*
                    {
                    otherlv_2=(Token)match(input,31,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getDirectionCSAccess().getImportsKeyword_2_0());

                    }
                    // InternalQVTimperative.g:943:1: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:944:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:944:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:945:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getDirectionCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDirectionCSAccess().getImportsPackageCrossReference_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_25);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:961:2: (otherlv_4= ',' ( ( ruleUnrestrictedName ) ) )*
                    loop19:
                    do {
                        int alt19=2;
                        int LA19_0 = input.LA(1);

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


                        switch (alt19) {
                    	case 1 :
                    	    // InternalQVTimperative.g:961:4: otherlv_4= ',' ( ( ruleUnrestrictedName ) )
                    	    {
                    	    otherlv_4=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_4, grammarAccess.getDirectionCSAccess().getCommaKeyword_2_2_0());

                    	    }
                    	    // InternalQVTimperative.g:965:1: ( ( ruleUnrestrictedName ) )
                    	    // InternalQVTimperative.g:966:1: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalQVTimperative.g:966:1: ( ruleUnrestrictedName )
                    	    // InternalQVTimperative.g:967:3: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      		  /* */

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      			if (current==null) {
                    	      	            current = createModelElement(grammarAccess.getDirectionCSRule());
                    	      	        }

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getDirectionCSAccess().getImportsPackageCrossReference_2_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_25);
                    	    ruleUnrestrictedName();

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

                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEntryPointCS"
    // InternalQVTimperative.g:991:1: entryRuleEntryPointCS returns [EObject current=null] : iv_ruleEntryPointCS= ruleEntryPointCS EOF ;
    public final EObject entryRuleEntryPointCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEntryPointCS = null;


        try {
            // InternalQVTimperative.g:992:2: (iv_ruleEntryPointCS= ruleEntryPointCS EOF )
            // InternalQVTimperative.g:993:2: iv_ruleEntryPointCS= ruleEntryPointCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEntryPointCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEntryPointCS=ruleEntryPointCS();

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

            }

        }

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


    // $ANTLR start "ruleEntryPointCS"
    // InternalQVTimperative.g:1000:1: ruleEntryPointCS returns [EObject current=null] : ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'entry' (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )? ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '{' ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )* otherlv_19= '}' ) ;
    public final EObject ruleEntryPointCS() throws RecognitionException {
        EObject current = null;

        Token lv_isStrict_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_19=null;
        AntlrDatatypeRuleToken lv_targetName_4_0 = null;

        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedParameters_15_0 = null;

        EObject lv_ownedStatements_16_0 = null;

        EObject lv_ownedStatements_17_0 = null;

        EObject lv_ownedStatements_18_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1003:28: ( ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'entry' (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )? ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '{' ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )* otherlv_19= '}' ) )
            // InternalQVTimperative.g:1004:1: ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'entry' (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )? ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '{' ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )* otherlv_19= '}' )
            {
            // InternalQVTimperative.g:1004:1: ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'entry' (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )? ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '{' ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )* otherlv_19= '}' )
            // InternalQVTimperative.g:1004:2: () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'entry' (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )? ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '{' ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )* otherlv_19= '}'
            {
            // InternalQVTimperative.g:1004:2: ()
            // InternalQVTimperative.g:1005:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getEntryPointCSAccess().getEntryPointCSAction_0(),
                          current);

            }

            }

            // InternalQVTimperative.g:1013:2: ( (lv_isStrict_1_0= 'strict' ) )?
            int alt21=2;
            int LA21_0 = input.LA(1);

            if ( (LA21_0==25) ) {
                alt21=1;
            }
            switch (alt21) {
                case 1 :
                    // InternalQVTimperative.g:1014:1: (lv_isStrict_1_0= 'strict' )
                    {
                    // InternalQVTimperative.g:1014:1: (lv_isStrict_1_0= 'strict' )
                    // InternalQVTimperative.g:1015:3: lv_isStrict_1_0= 'strict'
                    {
                    lv_isStrict_1_0=(Token)match(input,25,FollowSets000.FOLLOW_26); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isStrict_1_0, grammarAccess.getEntryPointCSAccess().getIsStrictStrictKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getEntryPointCSRule());
                      	        }
                             		setWithLastConsumed(current, "isStrict", true, "strict");

                    }

                    }


                    }
                    break;

            }

            otherlv_2=(Token)match(input,32,FollowSets000.FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getEntryPointCSAccess().getEntryKeyword_2());

            }
            // InternalQVTimperative.g:1032:1: (otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) ) )?
            int alt22=2;
            int LA22_0 = input.LA(1);

            if ( (LA22_0==24) ) {
                alt22=1;
            }
            switch (alt22) {
                case 1 :
                    // InternalQVTimperative.g:1032:3: otherlv_3= ':' ( (lv_targetName_4_0= ruleUnrestrictedName ) )
                    {
                    otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getEntryPointCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:1036:1: ( (lv_targetName_4_0= ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:1037:1: (lv_targetName_4_0= ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:1037:1: (lv_targetName_4_0= ruleUnrestrictedName )
                    // InternalQVTimperative.g:1038:3: lv_targetName_4_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getTargetNameUnrestrictedNameParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_targetName_4_0=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
                      	        }
                             		set(
                             			current,
                             			"targetName",
                              		lv_targetName_4_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:1054:4: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1055:1: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1055:1: (lv_name_5_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:1056:3: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getNameUnrestrictedNameParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_27);
            lv_name_5_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_5_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:1072:2: (otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )?
            int alt24=2;
            int LA24_0 = input.LA(1);

            if ( (LA24_0==33) ) {
                alt24=1;
            }
            switch (alt24) {
                case 1 :
                    // InternalQVTimperative.g:1072:4: otherlv_6= 'input' ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                    {
                    otherlv_6=(Token)match(input,33,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getEntryPointCSAccess().getInputKeyword_5_0());

                    }
                    // InternalQVTimperative.g:1076:1: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:1077:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:1077:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:1078:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getEntryPointCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getInputTypedModelsTypedModelCrossReference_5_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:1094:2: (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                    loop23:
                    do {
                        int alt23=2;
                        int LA23_0 = input.LA(1);

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


                        switch (alt23) {
                    	case 1 :
                    	    // InternalQVTimperative.g:1094:4: otherlv_8= ',' ( ( ruleUnrestrictedName ) )
                    	    {
                    	    otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_8, grammarAccess.getEntryPointCSAccess().getCommaKeyword_5_2_0());

                    	    }
                    	    // InternalQVTimperative.g:1098:1: ( ( ruleUnrestrictedName ) )
                    	    // InternalQVTimperative.g:1099:1: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalQVTimperative.g:1099:1: ( ruleUnrestrictedName )
                    	    // InternalQVTimperative.g:1100:3: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      		  /* */

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      			if (current==null) {
                    	      	            current = createModelElement(grammarAccess.getEntryPointCSRule());
                    	      	        }

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getInputTypedModelsTypedModelCrossReference_5_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_28);
                    	    ruleUnrestrictedName();

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

                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:1116:6: (otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )?
            int alt26=2;
            int LA26_0 = input.LA(1);

            if ( (LA26_0==34) ) {
                alt26=1;
            }
            switch (alt26) {
                case 1 :
                    // InternalQVTimperative.g:1116:8: otherlv_10= 'output' ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )*
                    {
                    otherlv_10=(Token)match(input,34,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getEntryPointCSAccess().getOutputKeyword_6_0());

                    }
                    // InternalQVTimperative.g:1120:1: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:1121:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:1121:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:1122:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getEntryPointCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOutputTypedModelsTypedModelCrossReference_6_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_29);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:1138:2: (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )*
                    loop25:
                    do {
                        int alt25=2;
                        int LA25_0 = input.LA(1);

                        if ( (LA25_0==18) ) {
                            alt25=1;
                        }


                        switch (alt25) {
                    	case 1 :
                    	    // InternalQVTimperative.g:1138:4: otherlv_12= ',' ( ( ruleUnrestrictedName ) )
                    	    {
                    	    otherlv_12=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_12, grammarAccess.getEntryPointCSAccess().getCommaKeyword_6_2_0());

                    	    }
                    	    // InternalQVTimperative.g:1142:1: ( ( ruleUnrestrictedName ) )
                    	    // InternalQVTimperative.g:1143:1: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalQVTimperative.g:1143:1: ( ruleUnrestrictedName )
                    	    // InternalQVTimperative.g:1144:3: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      		  /* */

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      			if (current==null) {
                    	      	            current = createModelElement(grammarAccess.getEntryPointCSRule());
                    	      	        }

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOutputTypedModelsTypedModelCrossReference_6_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_29);
                    	    ruleUnrestrictedName();

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

                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_14=(Token)match(input,35,FollowSets000.FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_14, grammarAccess.getEntryPointCSAccess().getLeftCurlyBracketKeyword_7());

            }
            // InternalQVTimperative.g:1164:1: ( (lv_ownedParameters_15_0= ruleMappingParameterCS ) )*
            loop27:
            do {
                int alt27=2;
                int LA27_0 = input.LA(1);

                if ( (LA27_0==23||LA27_0==38||LA27_0==49) ) {
                    alt27=1;
                }


                switch (alt27) {
            	case 1 :
            	    // InternalQVTimperative.g:1165:1: (lv_ownedParameters_15_0= ruleMappingParameterCS )
            	    {
            	    // InternalQVTimperative.g:1165:1: (lv_ownedParameters_15_0= ruleMappingParameterCS )
            	    // InternalQVTimperative.g:1166:3: lv_ownedParameters_15_0= ruleMappingParameterCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOwnedParametersMappingParameterCSParserRuleCall_8_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_ownedParameters_15_0=ruleMappingParameterCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedParameters",
            	              		lv_ownedParameters_15_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.MappingParameterCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1182:3: ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )*
            loop28:
            do {
                int alt28=2;
                alt28 = dfa28.predict(input);
                switch (alt28) {
            	case 1 :
            	    // InternalQVTimperative.g:1183:1: (lv_ownedStatements_16_0= ruleGuardStatementCS )
            	    {
            	    // InternalQVTimperative.g:1183:1: (lv_ownedStatements_16_0= ruleGuardStatementCS )
            	    // InternalQVTimperative.g:1184:3: lv_ownedStatements_16_0= ruleGuardStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOwnedStatementsGuardStatementCSParserRuleCall_9_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_31);
            	    lv_ownedStatements_16_0=ruleGuardStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_16_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.GuardStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1200:3: ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )*
            loop29:
            do {
                int alt29=2;
                alt29 = dfa29.predict(input);
                switch (alt29) {
            	case 1 :
            	    // InternalQVTimperative.g:1201:1: (lv_ownedStatements_17_0= ruleCommitStatementCS )
            	    {
            	    // InternalQVTimperative.g:1201:1: (lv_ownedStatements_17_0= ruleCommitStatementCS )
            	    // InternalQVTimperative.g:1202:3: lv_ownedStatements_17_0= ruleCommitStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOwnedStatementsCommitStatementCSParserRuleCall_10_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_32);
            	    lv_ownedStatements_17_0=ruleCommitStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_17_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.CommitStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1218:3: ( (lv_ownedStatements_18_0= ruleControlStatementCS ) )*
            loop30:
            do {
                int alt30=2;
                int LA30_0 = input.LA(1);

                if ( (LA30_0==17||LA30_0==19||(LA30_0>=45 && LA30_0<=48)) ) {
                    alt30=1;
                }


                switch (alt30) {
            	case 1 :
            	    // InternalQVTimperative.g:1219:1: (lv_ownedStatements_18_0= ruleControlStatementCS )
            	    {
            	    // InternalQVTimperative.g:1219:1: (lv_ownedStatements_18_0= ruleControlStatementCS )
            	    // InternalQVTimperative.g:1220:3: lv_ownedStatements_18_0= ruleControlStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getEntryPointCSAccess().getOwnedStatementsControlStatementCSParserRuleCall_11_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_33);
            	    lv_ownedStatements_18_0=ruleControlStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getEntryPointCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_18_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ControlStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            otherlv_19=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_19, grammarAccess.getEntryPointCSAccess().getRightCurlyBracketKeyword_12());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleGuardParameterBindingCS"
    // InternalQVTimperative.g:1248:1: entryRuleGuardParameterBindingCS returns [EObject current=null] : iv_ruleGuardParameterBindingCS= ruleGuardParameterBindingCS EOF ;
    public final EObject entryRuleGuardParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleGuardParameterBindingCS = null;


        try {
            // InternalQVTimperative.g:1249:2: (iv_ruleGuardParameterBindingCS= ruleGuardParameterBindingCS EOF )
            // InternalQVTimperative.g:1250:2: iv_ruleGuardParameterBindingCS= ruleGuardParameterBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getGuardParameterBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleGuardParameterBindingCS=ruleGuardParameterBindingCS();

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

            }

        }

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


    // $ANTLR start "ruleGuardParameterBindingCS"
    // InternalQVTimperative.g:1257:1: ruleGuardParameterBindingCS returns [EObject current=null] : ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'consumes' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' ) ;
    public final EObject ruleGuardParameterBindingCS() throws RecognitionException {
        EObject current = null;

        Token lv_isCheck_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;

         enterRule();

        try {
            // InternalQVTimperative.g:1260:28: ( ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'consumes' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' ) )
            // InternalQVTimperative.g:1261:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'consumes' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' )
            {
            // InternalQVTimperative.g:1261:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'consumes' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' )
            // InternalQVTimperative.g:1261:2: ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'consumes' ( ( ruleUnrestrictedName ) ) otherlv_4= ';'
            {
            // InternalQVTimperative.g:1261:2: ( (lv_isCheck_0_0= 'check' ) )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==29) ) {
                int LA31_1 = input.LA(2);

                if ( ((LA31_1>=RULE_SIMPLE_ID && LA31_1<=RULE_ESCAPED_ID)||LA31_1==17||LA31_1==19||(LA31_1>=22 && LA31_1<=23)||(LA31_1>=25 && LA31_1<=26)||(LA31_1>=29 && LA31_1<=34)||LA31_1==39||(LA31_1>=43 && LA31_1<=48)||(LA31_1>=50 && LA31_1<=52)||(LA31_1>=54 && LA31_1<=55)||(LA31_1>=58 && LA31_1<=60)||(LA31_1>=62 && LA31_1<=70)||LA31_1==72||LA31_1==74||LA31_1==76||LA31_1==79||LA31_1==81||LA31_1==83||(LA31_1>=85 && LA31_1<=89)||(LA31_1>=91 && LA31_1<=96)||LA31_1==98||LA31_1==100||(LA31_1>=102 && LA31_1<=105)) ) {
                    alt31=1;
                }
            }
            switch (alt31) {
                case 1 :
                    // InternalQVTimperative.g:1262:1: (lv_isCheck_0_0= 'check' )
                    {
                    // InternalQVTimperative.g:1262:1: (lv_isCheck_0_0= 'check' )
                    // InternalQVTimperative.g:1263:3: lv_isCheck_0_0= 'check'
                    {
                    lv_isCheck_0_0=(Token)match(input,29,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isCheck_0_0, grammarAccess.getGuardParameterBindingCSAccess().getIsCheckCheckKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getGuardParameterBindingCSRule());
                      	        }
                             		setWithLastConsumed(current, "isCheck", true, "check");

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:1276:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1277:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1277:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:1278:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getGuardParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getGuardParameterBindingCSAccess().getReferredVariableGuardParameterCrossReference_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_34);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,37,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getGuardParameterBindingCSAccess().getConsumesKeyword_2());

            }
            // InternalQVTimperative.g:1298:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1299:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1299:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:1300:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getGuardParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getGuardParameterBindingCSAccess().getValueConnectionVariableCrossReference_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getGuardParameterBindingCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleGuardParameterCS"
    // InternalQVTimperative.g:1328:1: entryRuleGuardParameterCS returns [EObject current=null] : iv_ruleGuardParameterCS= ruleGuardParameterCS EOF ;
    public final EObject entryRuleGuardParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleGuardParameterCS = null;


        try {
            // InternalQVTimperative.g:1329:2: (iv_ruleGuardParameterCS= ruleGuardParameterCS EOF )
            // InternalQVTimperative.g:1330:2: iv_ruleGuardParameterCS= ruleGuardParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getGuardParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleGuardParameterCS=ruleGuardParameterCS();

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

            }

        }

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


    // $ANTLR start "ruleGuardParameterCS"
    // InternalQVTimperative.g:1337:1: ruleGuardParameterCS returns [EObject current=null] : (otherlv_0= 'guard' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )? otherlv_8= ';' ) ;
    public final EObject ruleGuardParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        AntlrDatatypeRuleToken lv_name_3_0 = null;

        EObject lv_ownedType_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1340:28: ( (otherlv_0= 'guard' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )? otherlv_8= ';' ) )
            // InternalQVTimperative.g:1341:1: (otherlv_0= 'guard' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )? otherlv_8= ';' )
            {
            // InternalQVTimperative.g:1341:1: (otherlv_0= 'guard' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )? otherlv_8= ';' )
            // InternalQVTimperative.g:1341:3: otherlv_0= 'guard' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )? otherlv_8= ';'
            {
            otherlv_0=(Token)match(input,38,FollowSets000.FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getGuardParameterCSAccess().getGuardKeyword_0());

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

                  	newLeafNode(otherlv_1, grammarAccess.getGuardParameterCSAccess().getColonKeyword_1());

            }
            // InternalQVTimperative.g:1349:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1350:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1350:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:1351:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getGuardParameterCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getGuardParameterCSAccess().getReferredTypedModelTypedModelCrossReference_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_5);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:1367:2: ( (lv_name_3_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1368:1: (lv_name_3_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1368:1: (lv_name_3_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:1369:3: lv_name_3_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getGuardParameterCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_3_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getGuardParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_3_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getGuardParameterCSAccess().getColonKeyword_4());

            }
            // InternalQVTimperative.g:1389:1: ( (lv_ownedType_5_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:1390:1: (lv_ownedType_5_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:1390:1: (lv_ownedType_5_0= ruleTypeExpCS )
            // InternalQVTimperative.g:1391:3: lv_ownedType_5_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getGuardParameterCSAccess().getOwnedTypeTypeExpCSParserRuleCall_5_0());

            }
            pushFollow(FollowSets000.FOLLOW_35);
            lv_ownedType_5_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getGuardParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_5_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:1407:2: (otherlv_6= 'success' ( ( ruleUnrestrictedName ) ) )?
            int alt32=2;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==39) ) {
                alt32=1;
            }
            switch (alt32) {
                case 1 :
                    // InternalQVTimperative.g:1407:4: otherlv_6= 'success' ( ( ruleUnrestrictedName ) )
                    {
                    otherlv_6=(Token)match(input,39,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getGuardParameterCSAccess().getSuccessKeyword_6_0());

                    }
                    // InternalQVTimperative.g:1411:1: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:1412:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:1412:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:1413:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getGuardParameterCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getGuardParameterCSAccess().getSuccessPropertyPropertyCrossReference_6_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_9);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_8, grammarAccess.getGuardParameterCSAccess().getSemicolonKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleGuardStatementCS"
    // InternalQVTimperative.g:1441:1: entryRuleGuardStatementCS returns [EObject current=null] : iv_ruleGuardStatementCS= ruleGuardStatementCS EOF ;
    public final EObject entryRuleGuardStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleGuardStatementCS = null;


        try {
            // InternalQVTimperative.g:1442:2: (iv_ruleGuardStatementCS= ruleGuardStatementCS EOF )
            // InternalQVTimperative.g:1443:2: iv_ruleGuardStatementCS= ruleGuardStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getGuardStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleGuardStatementCS=ruleGuardStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleGuardStatementCS"
    // InternalQVTimperative.g:1450:1: ruleGuardStatementCS returns [EObject current=null] : (this_BufferStatementCS_0= ruleBufferStatementCS | this_DeclareStatementCS_1= ruleDeclareStatementCS | this_DeclareStatementCS_2= ruleDeclareStatementCS | this_CheckStatementCS_3= ruleCheckStatementCS | this_SpeculateStatementCS_4= ruleSpeculateStatementCS ) ;
    public final EObject ruleGuardStatementCS() throws RecognitionException {
        EObject current = null;

        EObject this_BufferStatementCS_0 = null;

        EObject this_DeclareStatementCS_1 = null;

        EObject this_DeclareStatementCS_2 = null;

        EObject this_CheckStatementCS_3 = null;

        EObject this_SpeculateStatementCS_4 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1453:28: ( (this_BufferStatementCS_0= ruleBufferStatementCS | this_DeclareStatementCS_1= ruleDeclareStatementCS | this_DeclareStatementCS_2= ruleDeclareStatementCS | this_CheckStatementCS_3= ruleCheckStatementCS | this_SpeculateStatementCS_4= ruleSpeculateStatementCS ) )
            // InternalQVTimperative.g:1454:1: (this_BufferStatementCS_0= ruleBufferStatementCS | this_DeclareStatementCS_1= ruleDeclareStatementCS | this_DeclareStatementCS_2= ruleDeclareStatementCS | this_CheckStatementCS_3= ruleCheckStatementCS | this_SpeculateStatementCS_4= ruleSpeculateStatementCS )
            {
            // InternalQVTimperative.g:1454:1: (this_BufferStatementCS_0= ruleBufferStatementCS | this_DeclareStatementCS_1= ruleDeclareStatementCS | this_DeclareStatementCS_2= ruleDeclareStatementCS | this_CheckStatementCS_3= ruleCheckStatementCS | this_SpeculateStatementCS_4= ruleSpeculateStatementCS )
            int alt33=5;
            alt33 = dfa33.predict(input);
            switch (alt33) {
                case 1 :
                    // InternalQVTimperative.g:1455:2: this_BufferStatementCS_0= ruleBufferStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getGuardStatementCSAccess().getBufferStatementCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BufferStatementCS_0=ruleBufferStatementCS();

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

                              current = this_BufferStatementCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:1468:2: this_DeclareStatementCS_1= ruleDeclareStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getGuardStatementCSAccess().getDeclareStatementCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DeclareStatementCS_1=ruleDeclareStatementCS();

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

                              current = this_DeclareStatementCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:1481:2: this_DeclareStatementCS_2= ruleDeclareStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getGuardStatementCSAccess().getDeclareStatementCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DeclareStatementCS_2=ruleDeclareStatementCS();

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

                              current = this_DeclareStatementCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:1494:2: this_CheckStatementCS_3= ruleCheckStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getGuardStatementCSAccess().getCheckStatementCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CheckStatementCS_3=ruleCheckStatementCS();

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

                              current = this_CheckStatementCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:1507:2: this_SpeculateStatementCS_4= ruleSpeculateStatementCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getGuardStatementCSAccess().getSpeculateStatementCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SpeculateStatementCS_4=ruleSpeculateStatementCS();

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

                              current = this_SpeculateStatementCS_4;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleImportCS"
    // InternalQVTimperative.g:1526:1: entryRuleImportCS returns [EObject current=null] : iv_ruleImportCS= ruleImportCS EOF ;
    public final EObject entryRuleImportCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleImportCS = null;


        try {
            // InternalQVTimperative.g:1527:2: (iv_ruleImportCS= ruleImportCS EOF )
            // InternalQVTimperative.g:1528:2: iv_ruleImportCS= ruleImportCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getImportCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleImportCS=ruleImportCS();

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

            }

        }

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


    // $ANTLR start "ruleImportCS"
    // InternalQVTimperative.g:1535:1: ruleImportCS returns [EObject current=null] : (otherlv_0= 'import' ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )? otherlv_6= ';' ) ;
    public final EObject ruleImportCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_isAll_4_0=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedPathName_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1538:28: ( (otherlv_0= 'import' ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )? otherlv_6= ';' ) )
            // InternalQVTimperative.g:1539:1: (otherlv_0= 'import' ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )? otherlv_6= ';' )
            {
            // InternalQVTimperative.g:1539:1: (otherlv_0= 'import' ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )? otherlv_6= ';' )
            // InternalQVTimperative.g:1539:3: otherlv_0= 'import' ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )? otherlv_6= ';'
            {
            otherlv_0=(Token)match(input,40,FollowSets000.FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getImportCSAccess().getImportKeyword_0());

            }
            // InternalQVTimperative.g:1543:1: ( ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':' )?
            int alt34=2;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==RULE_SIMPLE_ID) ) {
                int LA34_1 = input.LA(2);

                if ( (LA34_1==24) ) {
                    alt34=1;
                }
            }
            else if ( (LA34_0==RULE_ESCAPED_ID) ) {
                int LA34_2 = input.LA(2);

                if ( (LA34_2==24) ) {
                    alt34=1;
                }
            }
            switch (alt34) {
                case 1 :
                    // InternalQVTimperative.g:1543:2: ( (lv_name_1_0= ruleIdentifier ) ) otherlv_2= ':'
                    {
                    // InternalQVTimperative.g:1543:2: ( (lv_name_1_0= ruleIdentifier ) )
                    // InternalQVTimperative.g:1544:1: (lv_name_1_0= ruleIdentifier )
                    {
                    // InternalQVTimperative.g:1544:1: (lv_name_1_0= ruleIdentifier )
                    // InternalQVTimperative.g:1545:3: lv_name_1_0= ruleIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getImportCSAccess().getNameIdentifierParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_name_1_0=ruleIdentifier();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getImportCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.Identifier");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_2, grammarAccess.getImportCSAccess().getColonKeyword_1_1());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:1565:3: ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) )
            // InternalQVTimperative.g:1566:1: (lv_ownedPathName_3_0= ruleURIPathNameCS )
            {
            // InternalQVTimperative.g:1566:1: (lv_ownedPathName_3_0= ruleURIPathNameCS )
            // InternalQVTimperative.g:1567:3: lv_ownedPathName_3_0= ruleURIPathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_37);
            lv_ownedPathName_3_0=ruleURIPathNameCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getImportCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPathName",
                      		lv_ownedPathName_3_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.URIPathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:1583:2: ( ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*' )?
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==41) ) {
                alt35=1;
            }
            switch (alt35) {
                case 1 :
                    // InternalQVTimperative.g:1583:3: ( (lv_isAll_4_0= '::' ) ) otherlv_5= '*'
                    {
                    // InternalQVTimperative.g:1583:3: ( (lv_isAll_4_0= '::' ) )
                    // InternalQVTimperative.g:1584:1: (lv_isAll_4_0= '::' )
                    {
                    // InternalQVTimperative.g:1584:1: (lv_isAll_4_0= '::' )
                    // InternalQVTimperative.g:1585:3: lv_isAll_4_0= '::'
                    {
                    lv_isAll_4_0=(Token)match(input,41,FollowSets000.FOLLOW_38); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isAll_4_0, grammarAccess.getImportCSAccess().getIsAllColonColonKeyword_3_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getImportCSRule());
                      	        }
                             		setWithLastConsumed(current, "isAll", true, "::");

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_5, grammarAccess.getImportCSAccess().getAsteriskKeyword_3_1());

                    }

                    }
                    break;

            }

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

                  	newLeafNode(otherlv_6, grammarAccess.getImportCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleLoopParameterBindingCS"
    // InternalQVTimperative.g:1614:1: entryRuleLoopParameterBindingCS returns [EObject current=null] : iv_ruleLoopParameterBindingCS= ruleLoopParameterBindingCS EOF ;
    public final EObject entryRuleLoopParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLoopParameterBindingCS = null;


        try {
            // InternalQVTimperative.g:1615:2: (iv_ruleLoopParameterBindingCS= ruleLoopParameterBindingCS EOF )
            // InternalQVTimperative.g:1616:2: iv_ruleLoopParameterBindingCS= ruleLoopParameterBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLoopParameterBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLoopParameterBindingCS=ruleLoopParameterBindingCS();

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

            }

        }

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


    // $ANTLR start "ruleLoopParameterBindingCS"
    // InternalQVTimperative.g:1623:1: ruleLoopParameterBindingCS returns [EObject current=null] : ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'iterates' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' ) ;
    public final EObject ruleLoopParameterBindingCS() throws RecognitionException {
        EObject current = null;

        Token lv_isCheck_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;

         enterRule();

        try {
            // InternalQVTimperative.g:1626:28: ( ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'iterates' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' ) )
            // InternalQVTimperative.g:1627:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'iterates' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' )
            {
            // InternalQVTimperative.g:1627:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'iterates' ( ( ruleUnrestrictedName ) ) otherlv_4= ';' )
            // InternalQVTimperative.g:1627:2: ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'iterates' ( ( ruleUnrestrictedName ) ) otherlv_4= ';'
            {
            // InternalQVTimperative.g:1627:2: ( (lv_isCheck_0_0= 'check' ) )?
            int alt36=2;
            int LA36_0 = input.LA(1);

            if ( (LA36_0==29) ) {
                int LA36_1 = input.LA(2);

                if ( ((LA36_1>=RULE_SIMPLE_ID && LA36_1<=RULE_ESCAPED_ID)||LA36_1==17||LA36_1==19||(LA36_1>=22 && LA36_1<=23)||(LA36_1>=25 && LA36_1<=26)||(LA36_1>=29 && LA36_1<=34)||LA36_1==39||(LA36_1>=44 && LA36_1<=48)||(LA36_1>=50 && LA36_1<=52)||(LA36_1>=54 && LA36_1<=55)||(LA36_1>=58 && LA36_1<=60)||(LA36_1>=62 && LA36_1<=70)||LA36_1==72||LA36_1==74||LA36_1==76||LA36_1==79||LA36_1==81||LA36_1==83||(LA36_1>=85 && LA36_1<=89)||(LA36_1>=91 && LA36_1<=96)||LA36_1==98||LA36_1==100||(LA36_1>=102 && LA36_1<=105)) ) {
                    alt36=1;
                }
                else if ( (LA36_1==43) ) {
                    int LA36_4 = input.LA(3);

                    if ( (LA36_4==43) ) {
                        int LA36_5 = input.LA(4);

                        if ( ((LA36_5>=RULE_SIMPLE_ID && LA36_5<=RULE_ESCAPED_ID)||LA36_5==17||LA36_5==19||(LA36_5>=22 && LA36_5<=23)||(LA36_5>=25 && LA36_5<=26)||(LA36_5>=29 && LA36_5<=34)||LA36_5==39||(LA36_5>=43 && LA36_5<=48)||(LA36_5>=50 && LA36_5<=52)||(LA36_5>=54 && LA36_5<=55)||(LA36_5>=58 && LA36_5<=60)||(LA36_5>=62 && LA36_5<=70)||LA36_5==72||LA36_5==74||LA36_5==76||LA36_5==79||LA36_5==81||LA36_5==83||(LA36_5>=85 && LA36_5<=89)||(LA36_5>=91 && LA36_5<=96)||LA36_5==98||LA36_5==100||(LA36_5>=102 && LA36_5<=105)) ) {
                            alt36=1;
                        }
                    }
                }
            }
            switch (alt36) {
                case 1 :
                    // InternalQVTimperative.g:1628:1: (lv_isCheck_0_0= 'check' )
                    {
                    // InternalQVTimperative.g:1628:1: (lv_isCheck_0_0= 'check' )
                    // InternalQVTimperative.g:1629:3: lv_isCheck_0_0= 'check'
                    {
                    lv_isCheck_0_0=(Token)match(input,29,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isCheck_0_0, grammarAccess.getLoopParameterBindingCSAccess().getIsCheckCheckKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getLoopParameterBindingCSRule());
                      	        }
                             		setWithLastConsumed(current, "isCheck", true, "check");

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:1642:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1643:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1643:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:1644:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getLoopParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLoopParameterBindingCSAccess().getReferredVariableGuardParameterCrossReference_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_39);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,43,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getLoopParameterBindingCSAccess().getIteratesKeyword_2());

            }
            // InternalQVTimperative.g:1664:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1665:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1665:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:1666:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getLoopParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLoopParameterBindingCSAccess().getValueLoopVariableCrossReference_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getLoopParameterBindingCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingCS"
    // InternalQVTimperative.g:1694:1: entryRuleMappingCS returns [EObject current=null] : iv_ruleMappingCS= ruleMappingCS EOF ;
    public final EObject entryRuleMappingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingCS = null;


        try {
            // InternalQVTimperative.g:1695:2: (iv_ruleMappingCS= ruleMappingCS EOF )
            // InternalQVTimperative.g:1696:2: iv_ruleMappingCS= ruleMappingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingCS=ruleMappingCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingCS"
    // InternalQVTimperative.g:1703:1: ruleMappingCS returns [EObject current=null] : ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'map' (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )? ( (lv_name_7_0= ruleUnrestrictedName ) ) otherlv_8= '{' ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )* otherlv_13= '}' ) ;
    public final EObject ruleMappingCS() throws RecognitionException {
        EObject current = null;

        Token lv_isStrict_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_8=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_firstPass_4_0 = null;

        AntlrDatatypeRuleToken lv_lastPass_6_0 = null;

        AntlrDatatypeRuleToken lv_name_7_0 = null;

        EObject lv_ownedParameters_9_0 = null;

        EObject lv_ownedStatements_10_0 = null;

        EObject lv_ownedStatements_11_0 = null;

        EObject lv_ownedStatements_12_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1706:28: ( ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'map' (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )? ( (lv_name_7_0= ruleUnrestrictedName ) ) otherlv_8= '{' ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )* otherlv_13= '}' ) )
            // InternalQVTimperative.g:1707:1: ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'map' (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )? ( (lv_name_7_0= ruleUnrestrictedName ) ) otherlv_8= '{' ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )* otherlv_13= '}' )
            {
            // InternalQVTimperative.g:1707:1: ( () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'map' (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )? ( (lv_name_7_0= ruleUnrestrictedName ) ) otherlv_8= '{' ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )* otherlv_13= '}' )
            // InternalQVTimperative.g:1707:2: () ( (lv_isStrict_1_0= 'strict' ) )? otherlv_2= 'map' (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )? ( (lv_name_7_0= ruleUnrestrictedName ) ) otherlv_8= '{' ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )* ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )* ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )* ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )* otherlv_13= '}'
            {
            // InternalQVTimperative.g:1707:2: ()
            // InternalQVTimperative.g:1708:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getMappingCSAccess().getMappingCSAction_0(),
                          current);

            }

            }

            // InternalQVTimperative.g:1716:2: ( (lv_isStrict_1_0= 'strict' ) )?
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==25) ) {
                alt37=1;
            }
            switch (alt37) {
                case 1 :
                    // InternalQVTimperative.g:1717:1: (lv_isStrict_1_0= 'strict' )
                    {
                    // InternalQVTimperative.g:1717:1: (lv_isStrict_1_0= 'strict' )
                    // InternalQVTimperative.g:1718:3: lv_isStrict_1_0= 'strict'
                    {
                    lv_isStrict_1_0=(Token)match(input,25,FollowSets000.FOLLOW_40); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isStrict_1_0, grammarAccess.getMappingCSAccess().getIsStrictStrictKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMappingCSRule());
                      	        }
                             		setWithLastConsumed(current, "isStrict", true, "strict");

                    }

                    }


                    }
                    break;

            }

            otherlv_2=(Token)match(input,44,FollowSets000.FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getMappingCSAccess().getMapKeyword_2());

            }
            // InternalQVTimperative.g:1735:1: (otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )? )?
            int alt39=2;
            int LA39_0 = input.LA(1);

            if ( (LA39_0==24) ) {
                alt39=1;
            }
            switch (alt39) {
                case 1 :
                    // InternalQVTimperative.g:1735:3: otherlv_3= ':' ( (lv_firstPass_4_0= ruleLOWER ) ) (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )?
                    {
                    otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getMappingCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:1739:1: ( (lv_firstPass_4_0= ruleLOWER ) )
                    // InternalQVTimperative.g:1740:1: (lv_firstPass_4_0= ruleLOWER )
                    {
                    // InternalQVTimperative.g:1740:1: (lv_firstPass_4_0= ruleLOWER )
                    // InternalQVTimperative.g:1741:3: lv_firstPass_4_0= ruleLOWER
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMappingCSAccess().getFirstPassLOWERParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_16);
                    lv_firstPass_4_0=ruleLOWER();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
                      	        }
                             		set(
                             			current,
                             			"firstPass",
                              		lv_firstPass_4_0,
                              		"org.eclipse.ocl.xtext.base.Base.LOWER");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:1757:2: (otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) ) )?
                    int alt38=2;
                    int LA38_0 = input.LA(1);

                    if ( (LA38_0==27) ) {
                        alt38=1;
                    }
                    switch (alt38) {
                        case 1 :
                            // InternalQVTimperative.g:1757:4: otherlv_5= '..' ( (lv_lastPass_6_0= ruleLOWER ) )
                            {
                            otherlv_5=(Token)match(input,27,FollowSets000.FOLLOW_15); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_5, grammarAccess.getMappingCSAccess().getFullStopFullStopKeyword_3_2_0());

                            }
                            // InternalQVTimperative.g:1761:1: ( (lv_lastPass_6_0= ruleLOWER ) )
                            // InternalQVTimperative.g:1762:1: (lv_lastPass_6_0= ruleLOWER )
                            {
                            // InternalQVTimperative.g:1762:1: (lv_lastPass_6_0= ruleLOWER )
                            // InternalQVTimperative.g:1763:3: lv_lastPass_6_0= ruleLOWER
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getMappingCSAccess().getLastPassLOWERParserRuleCall_3_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_5);
                            lv_lastPass_6_0=ruleLOWER();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"lastPass",
                                      		lv_lastPass_6_0,
                                      		"org.eclipse.ocl.xtext.base.Base.LOWER");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:1779:6: ( (lv_name_7_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:1780:1: (lv_name_7_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:1780:1: (lv_name_7_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:1781:3: lv_name_7_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMappingCSAccess().getNameUnrestrictedNameParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_name_7_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_7_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_8=(Token)match(input,35,FollowSets000.FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getMappingCSAccess().getLeftCurlyBracketKeyword_5());

            }
            // InternalQVTimperative.g:1801:1: ( (lv_ownedParameters_9_0= ruleMappingParameterCS ) )*
            loop40:
            do {
                int alt40=2;
                int LA40_0 = input.LA(1);

                if ( (LA40_0==23||LA40_0==38||LA40_0==49) ) {
                    alt40=1;
                }


                switch (alt40) {
            	case 1 :
            	    // InternalQVTimperative.g:1802:1: (lv_ownedParameters_9_0= ruleMappingParameterCS )
            	    {
            	    // InternalQVTimperative.g:1802:1: (lv_ownedParameters_9_0= ruleMappingParameterCS )
            	    // InternalQVTimperative.g:1803:3: lv_ownedParameters_9_0= ruleMappingParameterCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingCSAccess().getOwnedParametersMappingParameterCSParserRuleCall_6_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_ownedParameters_9_0=ruleMappingParameterCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedParameters",
            	              		lv_ownedParameters_9_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.MappingParameterCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1819:3: ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )*
            loop41:
            do {
                int alt41=2;
                alt41 = dfa41.predict(input);
                switch (alt41) {
            	case 1 :
            	    // InternalQVTimperative.g:1820:1: (lv_ownedStatements_10_0= ruleGuardStatementCS )
            	    {
            	    // InternalQVTimperative.g:1820:1: (lv_ownedStatements_10_0= ruleGuardStatementCS )
            	    // InternalQVTimperative.g:1821:3: lv_ownedStatements_10_0= ruleGuardStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingCSAccess().getOwnedStatementsGuardStatementCSParserRuleCall_7_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_31);
            	    lv_ownedStatements_10_0=ruleGuardStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_10_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.GuardStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1837:3: ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )*
            loop42:
            do {
                int alt42=2;
                alt42 = dfa42.predict(input);
                switch (alt42) {
            	case 1 :
            	    // InternalQVTimperative.g:1838:1: (lv_ownedStatements_11_0= ruleCommitStatementCS )
            	    {
            	    // InternalQVTimperative.g:1838:1: (lv_ownedStatements_11_0= ruleCommitStatementCS )
            	    // InternalQVTimperative.g:1839:3: lv_ownedStatements_11_0= ruleCommitStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingCSAccess().getOwnedStatementsCommitStatementCSParserRuleCall_8_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_32);
            	    lv_ownedStatements_11_0=ruleCommitStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_11_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.CommitStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:1855:3: ( (lv_ownedStatements_12_0= ruleControlStatementCS ) )*
            loop43:
            do {
                int alt43=2;
                int LA43_0 = input.LA(1);

                if ( (LA43_0==17||LA43_0==19||(LA43_0>=45 && LA43_0<=48)) ) {
                    alt43=1;
                }


                switch (alt43) {
            	case 1 :
            	    // InternalQVTimperative.g:1856:1: (lv_ownedStatements_12_0= ruleControlStatementCS )
            	    {
            	    // InternalQVTimperative.g:1856:1: (lv_ownedStatements_12_0= ruleControlStatementCS )
            	    // InternalQVTimperative.g:1857:3: lv_ownedStatements_12_0= ruleControlStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingCSAccess().getOwnedStatementsControlStatementCSParserRuleCall_9_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_33);
            	    lv_ownedStatements_12_0=ruleControlStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedStatements",
            	              		lv_ownedStatements_12_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ControlStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

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

                  	newLeafNode(otherlv_13, grammarAccess.getMappingCSAccess().getRightCurlyBracketKeyword_10());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingCallCS"
    // InternalQVTimperative.g:1885:1: entryRuleMappingCallCS returns [EObject current=null] : iv_ruleMappingCallCS= ruleMappingCallCS EOF ;
    public final EObject entryRuleMappingCallCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingCallCS = null;


        try {
            // InternalQVTimperative.g:1886:2: (iv_ruleMappingCallCS= ruleMappingCallCS EOF )
            // InternalQVTimperative.g:1887:2: iv_ruleMappingCallCS= ruleMappingCallCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingCallCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingCallCS=ruleMappingCallCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingCallCS"
    // InternalQVTimperative.g:1894:1: ruleMappingCallCS returns [EObject current=null] : ( () (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) ) ( (lv_ownedPathName_4_0= rulePathNameCS ) ) otherlv_5= '{' ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )* otherlv_7= '}' ) ;
    public final EObject ruleMappingCallCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_isInstall_2_0=null;
        Token lv_isInvoke_3_0=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedPathName_4_0 = null;

        EObject lv_ownedBindings_6_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:1897:28: ( ( () (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) ) ( (lv_ownedPathName_4_0= rulePathNameCS ) ) otherlv_5= '{' ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )* otherlv_7= '}' ) )
            // InternalQVTimperative.g:1898:1: ( () (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) ) ( (lv_ownedPathName_4_0= rulePathNameCS ) ) otherlv_5= '{' ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )* otherlv_7= '}' )
            {
            // InternalQVTimperative.g:1898:1: ( () (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) ) ( (lv_ownedPathName_4_0= rulePathNameCS ) ) otherlv_5= '{' ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )* otherlv_7= '}' )
            // InternalQVTimperative.g:1898:2: () (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) ) ( (lv_ownedPathName_4_0= rulePathNameCS ) ) otherlv_5= '{' ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )* otherlv_7= '}'
            {
            // InternalQVTimperative.g:1898:2: ()
            // InternalQVTimperative.g:1899:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getMappingCallCSAccess().getMappingCallCSAction_0(),
                          current);

            }

            }

            // InternalQVTimperative.g:1907:2: (otherlv_1= 'call' | ( (lv_isInstall_2_0= 'install' ) ) | ( (lv_isInvoke_3_0= 'invoke' ) ) )
            int alt44=3;
            switch ( input.LA(1) ) {
            case 45:
                {
                alt44=1;
                }
                break;
            case 46:
                {
                alt44=2;
                }
                break;
            case 47:
                {
                alt44=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 44, 0, input);

                throw nvae;
            }

            switch (alt44) {
                case 1 :
                    // InternalQVTimperative.g:1907:4: otherlv_1= 'call'
                    {
                    otherlv_1=(Token)match(input,45,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMappingCallCSAccess().getCallKeyword_1_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:1912:6: ( (lv_isInstall_2_0= 'install' ) )
                    {
                    // InternalQVTimperative.g:1912:6: ( (lv_isInstall_2_0= 'install' ) )
                    // InternalQVTimperative.g:1913:1: (lv_isInstall_2_0= 'install' )
                    {
                    // InternalQVTimperative.g:1913:1: (lv_isInstall_2_0= 'install' )
                    // InternalQVTimperative.g:1914:3: lv_isInstall_2_0= 'install'
                    {
                    lv_isInstall_2_0=(Token)match(input,46,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isInstall_2_0, grammarAccess.getMappingCallCSAccess().getIsInstallInstallKeyword_1_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMappingCallCSRule());
                      	        }
                             		setWithLastConsumed(current, "isInstall", true, "install");

                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:1928:6: ( (lv_isInvoke_3_0= 'invoke' ) )
                    {
                    // InternalQVTimperative.g:1928:6: ( (lv_isInvoke_3_0= 'invoke' ) )
                    // InternalQVTimperative.g:1929:1: (lv_isInvoke_3_0= 'invoke' )
                    {
                    // InternalQVTimperative.g:1929:1: (lv_isInvoke_3_0= 'invoke' )
                    // InternalQVTimperative.g:1930:3: lv_isInvoke_3_0= 'invoke'
                    {
                    lv_isInvoke_3_0=(Token)match(input,47,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isInvoke_3_0, grammarAccess.getMappingCallCSAccess().getIsInvokeInvokeKeyword_1_2_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMappingCallCSRule());
                      	        }
                             		setWithLastConsumed(current, "isInvoke", true, "invoke");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:1943:3: ( (lv_ownedPathName_4_0= rulePathNameCS ) )
            // InternalQVTimperative.g:1944:1: (lv_ownedPathName_4_0= rulePathNameCS )
            {
            // InternalQVTimperative.g:1944:1: (lv_ownedPathName_4_0= rulePathNameCS )
            // InternalQVTimperative.g:1945:3: lv_ownedPathName_4_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMappingCallCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_ownedPathName_4_0=rulePathNameCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMappingCallCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPathName",
                      		lv_ownedPathName_4_0,
                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getMappingCallCSAccess().getLeftCurlyBracketKeyword_3());

            }
            // InternalQVTimperative.g:1965:1: ( (lv_ownedBindings_6_0= ruleMappingParameterBindingCS ) )*
            loop45:
            do {
                int alt45=2;
                int LA45_0 = input.LA(1);

                if ( ((LA45_0>=RULE_SIMPLE_ID && LA45_0<=RULE_ESCAPED_ID)||LA45_0==17||LA45_0==19||(LA45_0>=22 && LA45_0<=23)||(LA45_0>=25 && LA45_0<=26)||(LA45_0>=29 && LA45_0<=34)||LA45_0==39||(LA45_0>=43 && LA45_0<=48)||(LA45_0>=50 && LA45_0<=52)||(LA45_0>=54 && LA45_0<=55)||(LA45_0>=58 && LA45_0<=60)||(LA45_0>=62 && LA45_0<=70)||LA45_0==72||LA45_0==74||LA45_0==76||LA45_0==79||LA45_0==81||LA45_0==83||(LA45_0>=85 && LA45_0<=89)||(LA45_0>=91 && LA45_0<=96)||LA45_0==98||LA45_0==100||(LA45_0>=102 && LA45_0<=105)) ) {
                    alt45=1;
                }


                switch (alt45) {
            	case 1 :
            	    // InternalQVTimperative.g:1966:1: (lv_ownedBindings_6_0= ruleMappingParameterBindingCS )
            	    {
            	    // InternalQVTimperative.g:1966:1: (lv_ownedBindings_6_0= ruleMappingParameterBindingCS )
            	    // InternalQVTimperative.g:1967:3: lv_ownedBindings_6_0= ruleMappingParameterBindingCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingCallCSAccess().getOwnedBindingsMappingParameterBindingCSParserRuleCall_4_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_42);
            	    lv_ownedBindings_6_0=ruleMappingParameterBindingCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingCallCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedBindings",
            	              		lv_ownedBindings_6_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.MappingParameterBindingCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

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

                  	newLeafNode(otherlv_7, grammarAccess.getMappingCallCSAccess().getRightCurlyBracketKeyword_5());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingLoopCS"
    // InternalQVTimperative.g:1995:1: entryRuleMappingLoopCS returns [EObject current=null] : iv_ruleMappingLoopCS= ruleMappingLoopCS EOF ;
    public final EObject entryRuleMappingLoopCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingLoopCS = null;


        try {
            // InternalQVTimperative.g:1996:2: (iv_ruleMappingLoopCS= ruleMappingLoopCS EOF )
            // InternalQVTimperative.g:1997:2: iv_ruleMappingLoopCS= ruleMappingLoopCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingLoopCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingLoopCS=ruleMappingLoopCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingLoopCS"
    // InternalQVTimperative.g:2004:1: ruleMappingLoopCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'for' ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) ) otherlv_6= 'in' ( (lv_ownedInExpression_7_0= ruleExpCS ) ) otherlv_8= '{' ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+ otherlv_10= '}' ) ;
    public final EObject ruleMappingLoopCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        EObject lv_ownedIterator_5_0 = null;

        EObject lv_ownedInExpression_7_0 = null;

        EObject lv_ownedMappingStatements_9_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2007:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'for' ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) ) otherlv_6= 'in' ( (lv_ownedInExpression_7_0= ruleExpCS ) ) otherlv_8= '{' ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+ otherlv_10= '}' ) )
            // InternalQVTimperative.g:2008:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'for' ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) ) otherlv_6= 'in' ( (lv_ownedInExpression_7_0= ruleExpCS ) ) otherlv_8= '{' ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+ otherlv_10= '}' )
            {
            // InternalQVTimperative.g:2008:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'for' ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) ) otherlv_6= 'in' ( (lv_ownedInExpression_7_0= ruleExpCS ) ) otherlv_8= '{' ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+ otherlv_10= '}' )
            // InternalQVTimperative.g:2008:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? otherlv_4= 'for' ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) ) otherlv_6= 'in' ( (lv_ownedInExpression_7_0= ruleExpCS ) ) otherlv_8= '{' ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+ otherlv_10= '}'
            {
            // InternalQVTimperative.g:2008:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt47=2;
            int LA47_0 = input.LA(1);

            if ( (LA47_0==17) ) {
                alt47=1;
            }
            switch (alt47) {
                case 1 :
                    // InternalQVTimperative.g:2008:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getMappingLoopCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:2012:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:2013:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:2013:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:2014:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMappingLoopCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_43);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMappingLoopCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:2030:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop46:
                    do {
                        int alt46=2;
                        int LA46_0 = input.LA(1);

                        if ( (LA46_0==18) ) {
                            alt46=1;
                        }


                        switch (alt46) {
                    	case 1 :
                    	    // InternalQVTimperative.g:2030:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getMappingLoopCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:2034:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:2035:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:2035:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:2036:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getMappingLoopCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_43);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getMappingLoopCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_4=(Token)match(input,48,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getMappingLoopCSAccess().getForKeyword_1());

            }
            // InternalQVTimperative.g:2056:1: ( (lv_ownedIterator_5_0= ruleMappingIteratorCS ) )
            // InternalQVTimperative.g:2057:1: (lv_ownedIterator_5_0= ruleMappingIteratorCS )
            {
            // InternalQVTimperative.g:2057:1: (lv_ownedIterator_5_0= ruleMappingIteratorCS )
            // InternalQVTimperative.g:2058:3: lv_ownedIterator_5_0= ruleMappingIteratorCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMappingLoopCSAccess().getOwnedIteratorMappingIteratorCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_44);
            lv_ownedIterator_5_0=ruleMappingIteratorCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMappingLoopCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedIterator",
                      		lv_ownedIterator_5_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.MappingIteratorCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_6, grammarAccess.getMappingLoopCSAccess().getInKeyword_3());

            }
            // InternalQVTimperative.g:2078:1: ( (lv_ownedInExpression_7_0= ruleExpCS ) )
            // InternalQVTimperative.g:2079:1: (lv_ownedInExpression_7_0= ruleExpCS )
            {
            // InternalQVTimperative.g:2079:1: (lv_ownedInExpression_7_0= ruleExpCS )
            // InternalQVTimperative.g:2080:3: lv_ownedInExpression_7_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMappingLoopCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_ownedInExpression_7_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMappingLoopCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedInExpression",
                      		lv_ownedInExpression_7_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_8=(Token)match(input,35,FollowSets000.FOLLOW_45); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getMappingLoopCSAccess().getLeftCurlyBracketKeyword_5());

            }
            // InternalQVTimperative.g:2100:1: ( (lv_ownedMappingStatements_9_0= ruleControlStatementCS ) )+
            int cnt48=0;
            loop48:
            do {
                int alt48=2;
                int LA48_0 = input.LA(1);

                if ( (LA48_0==17||LA48_0==19||(LA48_0>=45 && LA48_0<=48)) ) {
                    alt48=1;
                }


                switch (alt48) {
            	case 1 :
            	    // InternalQVTimperative.g:2101:1: (lv_ownedMappingStatements_9_0= ruleControlStatementCS )
            	    {
            	    // InternalQVTimperative.g:2101:1: (lv_ownedMappingStatements_9_0= ruleControlStatementCS )
            	    // InternalQVTimperative.g:2102:3: lv_ownedMappingStatements_9_0= ruleControlStatementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getMappingLoopCSAccess().getOwnedMappingStatementsControlStatementCSParserRuleCall_6_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_33);
            	    lv_ownedMappingStatements_9_0=ruleControlStatementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMappingLoopCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedMappingStatements",
            	              		lv_ownedMappingStatements_9_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ControlStatementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            otherlv_10=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_10, grammarAccess.getMappingLoopCSAccess().getRightCurlyBracketKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingIteratorCS"
    // InternalQVTimperative.g:2130:1: entryRuleMappingIteratorCS returns [EObject current=null] : iv_ruleMappingIteratorCS= ruleMappingIteratorCS EOF ;
    public final EObject entryRuleMappingIteratorCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingIteratorCS = null;


        try {
            // InternalQVTimperative.g:2131:2: (iv_ruleMappingIteratorCS= ruleMappingIteratorCS EOF )
            // InternalQVTimperative.g:2132:2: iv_ruleMappingIteratorCS= ruleMappingIteratorCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingIteratorCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingIteratorCS=ruleMappingIteratorCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingIteratorCS"
    // InternalQVTimperative.g:2139:1: ruleMappingIteratorCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) ;
    public final EObject ruleMappingIteratorCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2142:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) )
            // InternalQVTimperative.g:2143:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            {
            // InternalQVTimperative.g:2143:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            // InternalQVTimperative.g:2143:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            {
            // InternalQVTimperative.g:2143:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2144:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2144:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:2145:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMappingIteratorCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_46);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMappingIteratorCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:2161:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==24) ) {
                alt49=1;
            }
            switch (alt49) {
                case 1 :
                    // InternalQVTimperative.g:2161:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMappingIteratorCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTimperative.g:2165:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:2166:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:2166:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:2167:3: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMappingIteratorCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedType_2_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMappingIteratorCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingParameterBindingCS"
    // InternalQVTimperative.g:2191:1: entryRuleMappingParameterBindingCS returns [EObject current=null] : iv_ruleMappingParameterBindingCS= ruleMappingParameterBindingCS EOF ;
    public final EObject entryRuleMappingParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingParameterBindingCS = null;


        try {
            // InternalQVTimperative.g:2192:2: (iv_ruleMappingParameterBindingCS= ruleMappingParameterBindingCS EOF )
            // InternalQVTimperative.g:2193:2: iv_ruleMappingParameterBindingCS= ruleMappingParameterBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingParameterBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingParameterBindingCS=ruleMappingParameterBindingCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingParameterBindingCS"
    // InternalQVTimperative.g:2200:1: ruleMappingParameterBindingCS returns [EObject current=null] : (this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS | this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS | this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS | this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS ) ;
    public final EObject ruleMappingParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject this_AppendParameterBindingCS_0 = null;

        EObject this_GuardParameterBindingCS_1 = null;

        EObject this_LoopParameterBindingCS_2 = null;

        EObject this_SimpleParameterBindingCS_3 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2203:28: ( (this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS | this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS | this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS | this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS ) )
            // InternalQVTimperative.g:2204:1: (this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS | this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS | this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS | this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS )
            {
            // InternalQVTimperative.g:2204:1: (this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS | this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS | this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS | this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS )
            int alt50=4;
            alt50 = dfa50.predict(input);
            switch (alt50) {
                case 1 :
                    // InternalQVTimperative.g:2205:2: this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterBindingCSAccess().getAppendParameterBindingCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AppendParameterBindingCS_0=ruleAppendParameterBindingCS();

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

                              current = this_AppendParameterBindingCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:2218:2: this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterBindingCSAccess().getGuardParameterBindingCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_GuardParameterBindingCS_1=ruleGuardParameterBindingCS();

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

                              current = this_GuardParameterBindingCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:2231:2: this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterBindingCSAccess().getLoopParameterBindingCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LoopParameterBindingCS_2=ruleLoopParameterBindingCS();

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

                              current = this_LoopParameterBindingCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:2244:2: this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterBindingCSAccess().getSimpleParameterBindingCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SimpleParameterBindingCS_3=ruleSimpleParameterBindingCS();

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

                              current = this_SimpleParameterBindingCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMappingParameterCS"
    // InternalQVTimperative.g:2263:1: entryRuleMappingParameterCS returns [EObject current=null] : iv_ruleMappingParameterCS= ruleMappingParameterCS EOF ;
    public final EObject entryRuleMappingParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMappingParameterCS = null;


        try {
            // InternalQVTimperative.g:2264:2: (iv_ruleMappingParameterCS= ruleMappingParameterCS EOF )
            // InternalQVTimperative.g:2265:2: iv_ruleMappingParameterCS= ruleMappingParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMappingParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMappingParameterCS=ruleMappingParameterCS();

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

            }

        }

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


    // $ANTLR start "ruleMappingParameterCS"
    // InternalQVTimperative.g:2272:1: ruleMappingParameterCS returns [EObject current=null] : (this_AppendParameterCS_0= ruleAppendParameterCS | this_GuardParameterCS_1= ruleGuardParameterCS | this_SimpleParameterCS_2= ruleSimpleParameterCS ) ;
    public final EObject ruleMappingParameterCS() throws RecognitionException {
        EObject current = null;

        EObject this_AppendParameterCS_0 = null;

        EObject this_GuardParameterCS_1 = null;

        EObject this_SimpleParameterCS_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2275:28: ( (this_AppendParameterCS_0= ruleAppendParameterCS | this_GuardParameterCS_1= ruleGuardParameterCS | this_SimpleParameterCS_2= ruleSimpleParameterCS ) )
            // InternalQVTimperative.g:2276:1: (this_AppendParameterCS_0= ruleAppendParameterCS | this_GuardParameterCS_1= ruleGuardParameterCS | this_SimpleParameterCS_2= ruleSimpleParameterCS )
            {
            // InternalQVTimperative.g:2276:1: (this_AppendParameterCS_0= ruleAppendParameterCS | this_GuardParameterCS_1= ruleGuardParameterCS | this_SimpleParameterCS_2= ruleSimpleParameterCS )
            int alt51=3;
            switch ( input.LA(1) ) {
            case 23:
                {
                alt51=1;
                }
                break;
            case 38:
                {
                alt51=2;
                }
                break;
            case 49:
                {
                alt51=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 51, 0, input);

                throw nvae;
            }

            switch (alt51) {
                case 1 :
                    // InternalQVTimperative.g:2277:2: this_AppendParameterCS_0= ruleAppendParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterCSAccess().getAppendParameterCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AppendParameterCS_0=ruleAppendParameterCS();

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

                              current = this_AppendParameterCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:2290:2: this_GuardParameterCS_1= ruleGuardParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterCSAccess().getGuardParameterCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_GuardParameterCS_1=ruleGuardParameterCS();

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

                              current = this_GuardParameterCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:2303:2: this_SimpleParameterCS_2= ruleSimpleParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMappingParameterCSAccess().getSimpleParameterCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SimpleParameterCS_2=ruleSimpleParameterCS();

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

                              current = this_SimpleParameterCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNewStatementCS"
    // InternalQVTimperative.g:2322:1: entryRuleNewStatementCS returns [EObject current=null] : iv_ruleNewStatementCS= ruleNewStatementCS EOF ;
    public final EObject entryRuleNewStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNewStatementCS = null;


        try {
            // InternalQVTimperative.g:2323:2: (iv_ruleNewStatementCS= ruleNewStatementCS EOF )
            // InternalQVTimperative.g:2324:2: iv_ruleNewStatementCS= ruleNewStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNewStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNewStatementCS=ruleNewStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleNewStatementCS"
    // InternalQVTimperative.g:2331:1: ruleNewStatementCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isContained_4_0= 'contained' ) )? otherlv_5= 'new' otherlv_6= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_8_0= ruleUnrestrictedName ) ) otherlv_9= ':' ( (lv_ownedType_10_0= ruleTypeExpCS ) ) (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )? otherlv_13= ';' ) ;
    public final EObject ruleNewStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_isContained_4_0=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        AntlrDatatypeRuleToken lv_name_8_0 = null;

        EObject lv_ownedType_10_0 = null;

        EObject lv_ownedExpression_12_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2334:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isContained_4_0= 'contained' ) )? otherlv_5= 'new' otherlv_6= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_8_0= ruleUnrestrictedName ) ) otherlv_9= ':' ( (lv_ownedType_10_0= ruleTypeExpCS ) ) (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )? otherlv_13= ';' ) )
            // InternalQVTimperative.g:2335:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isContained_4_0= 'contained' ) )? otherlv_5= 'new' otherlv_6= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_8_0= ruleUnrestrictedName ) ) otherlv_9= ':' ( (lv_ownedType_10_0= ruleTypeExpCS ) ) (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )? otherlv_13= ';' )
            {
            // InternalQVTimperative.g:2335:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isContained_4_0= 'contained' ) )? otherlv_5= 'new' otherlv_6= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_8_0= ruleUnrestrictedName ) ) otherlv_9= ':' ( (lv_ownedType_10_0= ruleTypeExpCS ) ) (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )? otherlv_13= ';' )
            // InternalQVTimperative.g:2335:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isContained_4_0= 'contained' ) )? otherlv_5= 'new' otherlv_6= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_8_0= ruleUnrestrictedName ) ) otherlv_9= ':' ( (lv_ownedType_10_0= ruleTypeExpCS ) ) (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )? otherlv_13= ';'
            {
            // InternalQVTimperative.g:2335:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt53=2;
            int LA53_0 = input.LA(1);

            if ( (LA53_0==17) ) {
                alt53=1;
            }
            switch (alt53) {
                case 1 :
                    // InternalQVTimperative.g:2335:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getNewStatementCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:2339:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:2340:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:2340:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:2341:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_47);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNewStatementCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:2357:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop52:
                    do {
                        int alt52=2;
                        int LA52_0 = input.LA(1);

                        if ( (LA52_0==18) ) {
                            alt52=1;
                        }


                        switch (alt52) {
                    	case 1 :
                    	    // InternalQVTimperative.g:2357:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getNewStatementCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:2361:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:2362:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:2362:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:2363:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_47);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getNewStatementCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:2379:6: ( (lv_isContained_4_0= 'contained' ) )?
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==50) ) {
                alt54=1;
            }
            switch (alt54) {
                case 1 :
                    // InternalQVTimperative.g:2380:1: (lv_isContained_4_0= 'contained' )
                    {
                    // InternalQVTimperative.g:2380:1: (lv_isContained_4_0= 'contained' )
                    // InternalQVTimperative.g:2381:3: lv_isContained_4_0= 'contained'
                    {
                    lv_isContained_4_0=(Token)match(input,50,FollowSets000.FOLLOW_48); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isContained_4_0, grammarAccess.getNewStatementCSAccess().getIsContainedContainedKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getNewStatementCSRule());
                      	        }
                             		setWithLastConsumed(current, "isContained", true, "contained");

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getNewStatementCSAccess().getNewKeyword_2());

            }
            otherlv_6=(Token)match(input,24,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_6, grammarAccess.getNewStatementCSAccess().getColonKeyword_3());

            }
            // InternalQVTimperative.g:2402:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2403:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2403:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:2404:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getNewStatementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getReferredTypedModelTypedModelCrossReference_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_5);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:2420:2: ( (lv_name_8_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2421:1: (lv_name_8_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2421:1: (lv_name_8_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:2422:3: lv_name_8_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getNameUnrestrictedNameParserRuleCall_5_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_8_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNewStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_8_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_9, grammarAccess.getNewStatementCSAccess().getColonKeyword_6());

            }
            // InternalQVTimperative.g:2442:1: ( (lv_ownedType_10_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:2443:1: (lv_ownedType_10_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:2443:1: (lv_ownedType_10_0= ruleTypeExpCS )
            // InternalQVTimperative.g:2444:3: lv_ownedType_10_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getOwnedTypeTypeExpCSParserRuleCall_7_0());

            }
            pushFollow(FollowSets000.FOLLOW_18);
            lv_ownedType_10_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNewStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_10_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:2460:2: (otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) ) )?
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==28) ) {
                alt55=1;
            }
            switch (alt55) {
                case 1 :
                    // InternalQVTimperative.g:2460:4: otherlv_11= ':=' ( (lv_ownedExpression_12_0= ruleExpCS ) )
                    {
                    otherlv_11=(Token)match(input,28,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_11, grammarAccess.getNewStatementCSAccess().getColonEqualsSignKeyword_8_0());

                    }
                    // InternalQVTimperative.g:2464:1: ( (lv_ownedExpression_12_0= ruleExpCS ) )
                    // InternalQVTimperative.g:2465:1: (lv_ownedExpression_12_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:2465:1: (lv_ownedExpression_12_0= ruleExpCS )
                    // InternalQVTimperative.g:2466:3: lv_ownedExpression_12_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNewStatementCSAccess().getOwnedExpressionExpCSParserRuleCall_8_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_9);
                    lv_ownedExpression_12_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNewStatementCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_12_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_13, grammarAccess.getNewStatementCSAccess().getSemicolonKeyword_9());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleParamDeclarationCS"
    // InternalQVTimperative.g:2494:1: entryRuleParamDeclarationCS returns [EObject current=null] : iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF ;
    public final EObject entryRuleParamDeclarationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParamDeclarationCS = null;


        try {
            // InternalQVTimperative.g:2495:2: (iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF )
            // InternalQVTimperative.g:2496:2: iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParamDeclarationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParamDeclarationCS=ruleParamDeclarationCS();

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

            }

        }

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


    // $ANTLR start "ruleParamDeclarationCS"
    // InternalQVTimperative.g:2503:1: ruleParamDeclarationCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject ruleParamDeclarationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2506:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTimperative.g:2507:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTimperative.g:2507:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTimperative.g:2507:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTimperative.g:2507:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2508:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2508:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:2509:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getParamDeclarationCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getParamDeclarationCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getParamDeclarationCSAccess().getColonKeyword_1());

            }
            // InternalQVTimperative.g:2529:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:2530:1: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:2530:1: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalQVTimperative.g:2531:3: lv_ownedType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getParamDeclarationCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_2_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getParamDeclarationCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleQualifiedPackageCS"
    // InternalQVTimperative.g:2555:1: entryRuleQualifiedPackageCS returns [EObject current=null] : iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF ;
    public final EObject entryRuleQualifiedPackageCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQualifiedPackageCS = null;


        try {
            // InternalQVTimperative.g:2556:2: (iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF )
            // InternalQVTimperative.g:2557:2: iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedPackageCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQualifiedPackageCS=ruleQualifiedPackageCS();

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

            }

        }

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


    // $ANTLR start "ruleQualifiedPackageCS"
    // InternalQVTimperative.g:2564:1: ruleQualifiedPackageCS returns [EObject current=null] : (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) ;
    public final EObject ruleQualifiedPackageCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        EObject lv_ownedPathName_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_nsPrefix_4_0 = null;

        AntlrDatatypeRuleToken lv_nsURI_6_0 = null;

        EObject lv_ownedPackages_8_0 = null;

        EObject lv_ownedClasses_9_1 = null;

        EObject lv_ownedClasses_9_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2567:28: ( (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) )
            // InternalQVTimperative.g:2568:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            {
            // InternalQVTimperative.g:2568:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            // InternalQVTimperative.g:2568:3: otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            {
            otherlv_0=(Token)match(input,52,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getQualifiedPackageCSAccess().getPackageKeyword_0());

            }
            // InternalQVTimperative.g:2572:1: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?
            int alt56=2;
            alt56 = dfa56.predict(input);
            switch (alt56) {
                case 1 :
                    // InternalQVTimperative.g:2573:1: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    {
                    // InternalQVTimperative.g:2573:1: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    // InternalQVTimperative.g:2574:3: lv_ownedPathName_1_0= ruleScopeNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedPathNameScopeNameCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_ownedPathName_1_0=ruleScopeNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedPathName",
                              		lv_ownedPathName_1_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ScopeNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:2590:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2591:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2591:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:2592:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_49);
            lv_name_2_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_2_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:2608:2: (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )?
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==24) ) {
                alt57=1;
            }
            switch (alt57) {
                case 1 :
                    // InternalQVTimperative.g:2608:4: otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) )
                    {
                    otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getQualifiedPackageCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:2612:1: ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:2613:1: (lv_nsPrefix_4_0= ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:2613:1: (lv_nsPrefix_4_0= ruleUnrestrictedName )
                    // InternalQVTimperative.g:2614:3: lv_nsPrefix_4_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_50);
                    lv_nsPrefix_4_0=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      	        }
                             		set(
                             			current,
                             			"nsPrefix",
                              		lv_nsPrefix_4_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:2630:4: (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )?
            int alt58=2;
            int LA58_0 = input.LA(1);

            if ( (LA58_0==53) ) {
                alt58=1;
            }
            switch (alt58) {
                case 1 :
                    // InternalQVTimperative.g:2630:6: otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) )
                    {
                    otherlv_5=(Token)match(input,53,FollowSets000.FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getQualifiedPackageCSAccess().getEqualsSignKeyword_4_0());

                    }
                    // InternalQVTimperative.g:2634:1: ( (lv_nsURI_6_0= ruleURI ) )
                    // InternalQVTimperative.g:2635:1: (lv_nsURI_6_0= ruleURI )
                    {
                    // InternalQVTimperative.g:2635:1: (lv_nsURI_6_0= ruleURI )
                    // InternalQVTimperative.g:2636:3: lv_nsURI_6_0= ruleURI
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNsURIURIParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_51);
                    lv_nsURI_6_0=ruleURI();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      	        }
                             		set(
                             			current,
                             			"nsURI",
                              		lv_nsURI_6_0,
                              		"org.eclipse.ocl.xtext.base.Base.URI");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:2652:4: ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            int alt61=2;
            int LA61_0 = input.LA(1);

            if ( (LA61_0==35) ) {
                alt61=1;
            }
            else if ( (LA61_0==21) ) {
                alt61=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 61, 0, input);

                throw nvae;
            }
            switch (alt61) {
                case 1 :
                    // InternalQVTimperative.g:2652:5: (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' )
                    {
                    // InternalQVTimperative.g:2652:5: (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' )
                    // InternalQVTimperative.g:2652:7: otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}'
                    {
                    otherlv_7=(Token)match(input,35,FollowSets000.FOLLOW_52); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getQualifiedPackageCSAccess().getLeftCurlyBracketKeyword_5_0_0());

                    }
                    // InternalQVTimperative.g:2656:1: ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )*
                    loop60:
                    do {
                        int alt60=3;
                        int LA60_0 = input.LA(1);

                        if ( (LA60_0==52) ) {
                            alt60=1;
                        }
                        else if ( (LA60_0==64||(LA60_0>=87 && LA60_0<=88)||LA60_0==91||(LA60_0>=102 && LA60_0<=103)) ) {
                            alt60=2;
                        }


                        switch (alt60) {
                    	case 1 :
                    	    // InternalQVTimperative.g:2656:2: ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) )
                    	    {
                    	    // InternalQVTimperative.g:2656:2: ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) )
                    	    // InternalQVTimperative.g:2657:1: (lv_ownedPackages_8_0= ruleQualifiedPackageCS )
                    	    {
                    	    // InternalQVTimperative.g:2657:1: (lv_ownedPackages_8_0= ruleQualifiedPackageCS )
                    	    // InternalQVTimperative.g:2658:3: lv_ownedPackages_8_0= ruleQualifiedPackageCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedPackagesQualifiedPackageCSParserRuleCall_5_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_52);
                    	    lv_ownedPackages_8_0=ruleQualifiedPackageCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedPackages",
                    	              		lv_ownedPackages_8_0,
                    	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.QualifiedPackageCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTimperative.g:2675:6: ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) )
                    	    {
                    	    // InternalQVTimperative.g:2675:6: ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) )
                    	    // InternalQVTimperative.g:2676:1: ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) )
                    	    {
                    	    // InternalQVTimperative.g:2676:1: ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) )
                    	    // InternalQVTimperative.g:2677:1: (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS )
                    	    {
                    	    // InternalQVTimperative.g:2677:1: (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS )
                    	    int alt59=2;
                    	    int LA59_0 = input.LA(1);

                    	    if ( ((LA59_0>=87 && LA59_0<=88)||LA59_0==91||(LA59_0>=102 && LA59_0<=103)) ) {
                    	        alt59=1;
                    	    }
                    	    else if ( (LA59_0==64) ) {
                    	        alt59=2;
                    	    }
                    	    else {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 59, 0, input);

                    	        throw nvae;
                    	    }
                    	    switch (alt59) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:2678:3: lv_ownedClasses_9_1= ruleClassCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedClassesClassCSParserRuleCall_5_0_1_1_0_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_52);
                    	            lv_ownedClasses_9_1=ruleClassCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedClasses",
                    	                      		lv_ownedClasses_9_1,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ClassCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:2693:8: lv_ownedClasses_9_2= ruleTransformationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedClassesTransformationCSParserRuleCall_5_0_1_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_52);
                    	            lv_ownedClasses_9_2=ruleTransformationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedClasses",
                    	                      		lv_ownedClasses_9_2,
                    	                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.TransformationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_10=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getQualifiedPackageCSAccess().getRightCurlyBracketKeyword_5_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:2716:7: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_11, grammarAccess.getQualifiedPackageCSAccess().getSemicolonKeyword_5_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleQueryCS"
    // InternalQVTimperative.g:2728:1: entryRuleQueryCS returns [EObject current=null] : iv_ruleQueryCS= ruleQueryCS EOF ;
    public final EObject entryRuleQueryCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQueryCS = null;


        try {
            // InternalQVTimperative.g:2729:2: (iv_ruleQueryCS= ruleQueryCS EOF )
            // InternalQVTimperative.g:2730:2: iv_ruleQueryCS= ruleQueryCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQueryCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQueryCS=ruleQueryCS();

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

            }

        }

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


    // $ANTLR start "ruleQueryCS"
    // InternalQVTimperative.g:2737:1: ruleQueryCS returns [EObject current=null] : ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) ) ;
    public final EObject ruleQueryCS() throws RecognitionException {
        EObject current = null;

        Token lv_isTransient_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=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;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedParameters_4_0 = null;

        EObject lv_ownedParameters_6_0 = null;

        EObject lv_ownedType_9_0 = null;

        EObject lv_ownedExpression_12_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2740:28: ( ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) ) )
            // InternalQVTimperative.g:2741:1: ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) )
            {
            // InternalQVTimperative.g:2741:1: ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) )
            // InternalQVTimperative.g:2741:2: ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) )
            {
            // InternalQVTimperative.g:2741:2: ( (lv_isTransient_0_0= 'transient' ) )?
            int alt62=2;
            int LA62_0 = input.LA(1);

            if ( (LA62_0==54) ) {
                alt62=1;
            }
            switch (alt62) {
                case 1 :
                    // InternalQVTimperative.g:2742:1: (lv_isTransient_0_0= 'transient' )
                    {
                    // InternalQVTimperative.g:2742:1: (lv_isTransient_0_0= 'transient' )
                    // InternalQVTimperative.g:2743:3: lv_isTransient_0_0= 'transient'
                    {
                    lv_isTransient_0_0=(Token)match(input,54,FollowSets000.FOLLOW_53); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isTransient_0_0, grammarAccess.getQueryCSAccess().getIsTransientTransientKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getQueryCSAccess().getQueryKeyword_1());

            }
            // InternalQVTimperative.g:2760:1: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:2761:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:2761:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:2762:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getQueryCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_name_2_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getQueryCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_2_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_3, grammarAccess.getQueryCSAccess().getLeftParenthesisKeyword_3());

            }
            // InternalQVTimperative.g:2782:1: ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )?
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( ((LA64_0>=RULE_SIMPLE_ID && LA64_0<=RULE_ESCAPED_ID)||LA64_0==17||LA64_0==19||(LA64_0>=22 && LA64_0<=23)||(LA64_0>=25 && LA64_0<=26)||(LA64_0>=29 && LA64_0<=34)||LA64_0==39||(LA64_0>=43 && LA64_0<=48)||(LA64_0>=50 && LA64_0<=52)||(LA64_0>=54 && LA64_0<=55)||(LA64_0>=58 && LA64_0<=60)||(LA64_0>=62 && LA64_0<=70)||LA64_0==72||LA64_0==74||LA64_0==76||LA64_0==79||LA64_0==81||LA64_0==83||(LA64_0>=85 && LA64_0<=89)||(LA64_0>=91 && LA64_0<=96)||LA64_0==98||LA64_0==100||(LA64_0>=102 && LA64_0<=105)) ) {
                alt64=1;
            }
            switch (alt64) {
                case 1 :
                    // InternalQVTimperative.g:2782:2: ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )*
                    {
                    // InternalQVTimperative.g:2782:2: ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) )
                    // InternalQVTimperative.g:2783:1: (lv_ownedParameters_4_0= ruleParamDeclarationCS )
                    {
                    // InternalQVTimperative.g:2783:1: (lv_ownedParameters_4_0= ruleParamDeclarationCS )
                    // InternalQVTimperative.g:2784:3: lv_ownedParameters_4_0= ruleParamDeclarationCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedParametersParamDeclarationCSParserRuleCall_4_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_56);
                    lv_ownedParameters_4_0=ruleParamDeclarationCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getQueryCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParameters",
                              		lv_ownedParameters_4_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ParamDeclarationCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:2800:2: (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )*
                    loop63:
                    do {
                        int alt63=2;
                        int LA63_0 = input.LA(1);

                        if ( (LA63_0==18) ) {
                            alt63=1;
                        }


                        switch (alt63) {
                    	case 1 :
                    	    // InternalQVTimperative.g:2800:4: otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) )
                    	    {
                    	    otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getQueryCSAccess().getCommaKeyword_4_1_0());

                    	    }
                    	    // InternalQVTimperative.g:2804:1: ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) )
                    	    // InternalQVTimperative.g:2805:1: (lv_ownedParameters_6_0= ruleParamDeclarationCS )
                    	    {
                    	    // InternalQVTimperative.g:2805:1: (lv_ownedParameters_6_0= ruleParamDeclarationCS )
                    	    // InternalQVTimperative.g:2806:3: lv_ownedParameters_6_0= ruleParamDeclarationCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedParametersParamDeclarationCSParserRuleCall_4_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_56);
                    	    lv_ownedParameters_6_0=ruleParamDeclarationCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getQueryCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParameters",
                    	              		lv_ownedParameters_6_0,
                    	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ParamDeclarationCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getQueryCSAccess().getRightParenthesisKeyword_5());

            }
            otherlv_8=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getQueryCSAccess().getColonKeyword_6());

            }
            // InternalQVTimperative.g:2830:1: ( (lv_ownedType_9_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:2831:1: (lv_ownedType_9_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:2831:1: (lv_ownedType_9_0= ruleTypeExpCS )
            // InternalQVTimperative.g:2832:3: lv_ownedType_9_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedTypeTypeExpCSParserRuleCall_7_0());

            }
            pushFollow(FollowSets000.FOLLOW_57);
            lv_ownedType_9_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getQueryCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_9_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:2848:2: (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) )
            int alt65=3;
            switch ( input.LA(1) ) {
            case 21:
                {
                alt65=1;
                }
                break;
            case 35:
                {
                alt65=2;
                }
                break;
            case 58:
                {
                alt65=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;
            }

            switch (alt65) {
                case 1 :
                    // InternalQVTimperative.g:2848:4: otherlv_10= ';'
                    {
                    otherlv_10=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getQueryCSAccess().getSemicolonKeyword_8_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:2853:6: (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' )
                    {
                    // InternalQVTimperative.g:2853:6: (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' )
                    // InternalQVTimperative.g:2853:8: otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}'
                    {
                    otherlv_11=(Token)match(input,35,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_11, grammarAccess.getQueryCSAccess().getLeftCurlyBracketKeyword_8_1_0());

                    }
                    // InternalQVTimperative.g:2857:1: ( (lv_ownedExpression_12_0= ruleExpCS ) )
                    // InternalQVTimperative.g:2858:1: (lv_ownedExpression_12_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:2858:1: (lv_ownedExpression_12_0= ruleExpCS )
                    // InternalQVTimperative.g:2859:3: lv_ownedExpression_12_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedExpressionExpCSParserRuleCall_8_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_ownedExpression_12_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getQueryCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_12_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_13, grammarAccess.getQueryCSAccess().getRightCurlyBracketKeyword_8_1_2());

                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:2880:6: (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' )
                    {
                    // InternalQVTimperative.g:2880:6: (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' )
                    // InternalQVTimperative.g:2880:8: otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';'
                    {
                    otherlv_14=(Token)match(input,58,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_14, grammarAccess.getQueryCSAccess().getImplementedbyKeyword_8_2_0());

                    }
                    // InternalQVTimperative.g:2884:1: ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:2885:1: (otherlv_15= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:2885:1: (otherlv_15= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:2886:3: otherlv_15= RULE_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getQueryCSRule());
                      	        }

                    }
                    otherlv_15=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_15, grammarAccess.getQueryCSAccess().getImplementationJavaClassCSCrossReference_8_2_1_0());

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_16, grammarAccess.getQueryCSAccess().getSemicolonKeyword_8_2_2());

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleScopeNameCS"
    // InternalQVTimperative.g:2912:1: entryRuleScopeNameCS returns [EObject current=null] : iv_ruleScopeNameCS= ruleScopeNameCS EOF ;
    public final EObject entryRuleScopeNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleScopeNameCS = null;


        try {
            // InternalQVTimperative.g:2913:2: (iv_ruleScopeNameCS= ruleScopeNameCS EOF )
            // InternalQVTimperative.g:2914:2: iv_ruleScopeNameCS= ruleScopeNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getScopeNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleScopeNameCS=ruleScopeNameCS();

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

            }

        }

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


    // $ANTLR start "ruleScopeNameCS"
    // InternalQVTimperative.g:2921:1: ruleScopeNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* ) ;
    public final EObject ruleScopeNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2924:28: ( ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* ) )
            // InternalQVTimperative.g:2925:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* )
            {
            // InternalQVTimperative.g:2925:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* )
            // InternalQVTimperative.g:2925:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*
            {
            // InternalQVTimperative.g:2925:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) )
            // InternalQVTimperative.g:2926:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            {
            // InternalQVTimperative.g:2926:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            // InternalQVTimperative.g:2927:3: lv_ownedPathElements_0_0= ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getScopeNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_60);
            lv_ownedPathElements_0_0=ruleFirstPathElementCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getScopeNameCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedPathElements",
                      		lv_ownedPathElements_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.FirstPathElementCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getScopeNameCSAccess().getColonColonKeyword_1());

            }
            // InternalQVTimperative.g:2947:1: ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*
            loop66:
            do {
                int alt66=2;
                alt66 = dfa66.predict(input);
                switch (alt66) {
            	case 1 :
            	    // InternalQVTimperative.g:2947:2: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::'
            	    {
            	    // InternalQVTimperative.g:2947:2: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTimperative.g:2948:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTimperative.g:2948:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTimperative.g:2949:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getScopeNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_2_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_60);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getScopeNameCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedPathElements",
            	              		lv_ownedPathElements_2_0,
            	              		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }

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

            	          	newLeafNode(otherlv_3, grammarAccess.getScopeNameCSAccess().getColonColonKeyword_2_1());

            	    }

            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSetStatementCS"
    // InternalQVTimperative.g:2977:1: entryRuleSetStatementCS returns [EObject current=null] : iv_ruleSetStatementCS= ruleSetStatementCS EOF ;
    public final EObject entryRuleSetStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSetStatementCS = null;


        try {
            // InternalQVTimperative.g:2978:2: (iv_ruleSetStatementCS= ruleSetStatementCS EOF )
            // InternalQVTimperative.g:2979:2: iv_ruleSetStatementCS= ruleSetStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSetStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSetStatementCS=ruleSetStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleSetStatementCS"
    // InternalQVTimperative.g:2986:1: ruleSetStatementCS returns [EObject current=null] : ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isNotify_4_0= 'notify' ) )? otherlv_5= 'set' ( ( ruleUnrestrictedName ) ) otherlv_7= '.' ( ( ruleUnrestrictedName ) ) (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) ) ( (lv_ownedExpression_11_0= ruleExpCS ) ) otherlv_12= ';' ) ;
    public final EObject ruleSetStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_isNotify_4_0=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token lv_isPartial_10_0=null;
        Token otherlv_12=null;
        EObject lv_observedProperties_1_0 = null;

        EObject lv_observedProperties_3_0 = null;

        EObject lv_ownedExpression_11_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:2989:28: ( ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isNotify_4_0= 'notify' ) )? otherlv_5= 'set' ( ( ruleUnrestrictedName ) ) otherlv_7= '.' ( ( ruleUnrestrictedName ) ) (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) ) ( (lv_ownedExpression_11_0= ruleExpCS ) ) otherlv_12= ';' ) )
            // InternalQVTimperative.g:2990:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isNotify_4_0= 'notify' ) )? otherlv_5= 'set' ( ( ruleUnrestrictedName ) ) otherlv_7= '.' ( ( ruleUnrestrictedName ) ) (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) ) ( (lv_ownedExpression_11_0= ruleExpCS ) ) otherlv_12= ';' )
            {
            // InternalQVTimperative.g:2990:1: ( (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isNotify_4_0= 'notify' ) )? otherlv_5= 'set' ( ( ruleUnrestrictedName ) ) otherlv_7= '.' ( ( ruleUnrestrictedName ) ) (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) ) ( (lv_ownedExpression_11_0= ruleExpCS ) ) otherlv_12= ';' )
            // InternalQVTimperative.g:2990:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )? ( (lv_isNotify_4_0= 'notify' ) )? otherlv_5= 'set' ( ( ruleUnrestrictedName ) ) otherlv_7= '.' ( ( ruleUnrestrictedName ) ) (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) ) ( (lv_ownedExpression_11_0= ruleExpCS ) ) otherlv_12= ';'
            {
            // InternalQVTimperative.g:2990:2: (otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )* )?
            int alt68=2;
            int LA68_0 = input.LA(1);

            if ( (LA68_0==17) ) {
                alt68=1;
            }
            switch (alt68) {
                case 1 :
                    // InternalQVTimperative.g:2990:4: otherlv_0= 'observe' ( (lv_observedProperties_1_0= rulePathNameCS ) ) (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    {
                    otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getSetStatementCSAccess().getObserveKeyword_0_0());

                    }
                    // InternalQVTimperative.g:2994:1: ( (lv_observedProperties_1_0= rulePathNameCS ) )
                    // InternalQVTimperative.g:2995:1: (lv_observedProperties_1_0= rulePathNameCS )
                    {
                    // InternalQVTimperative.g:2995:1: (lv_observedProperties_1_0= rulePathNameCS )
                    // InternalQVTimperative.g:2996:3: lv_observedProperties_1_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getSetStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    lv_observedProperties_1_0=rulePathNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getSetStatementCSRule());
                      	        }
                             		add(
                             			current,
                             			"observedProperties",
                              		lv_observedProperties_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:3012:2: (otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) ) )*
                    loop67:
                    do {
                        int alt67=2;
                        int LA67_0 = input.LA(1);

                        if ( (LA67_0==18) ) {
                            alt67=1;
                        }


                        switch (alt67) {
                    	case 1 :
                    	    // InternalQVTimperative.g:3012:4: otherlv_2= ',' ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_2, grammarAccess.getSetStatementCSAccess().getCommaKeyword_0_2_0());

                    	    }
                    	    // InternalQVTimperative.g:3016:1: ( (lv_observedProperties_3_0= rulePathNameCS ) )
                    	    // InternalQVTimperative.g:3017:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    {
                    	    // InternalQVTimperative.g:3017:1: (lv_observedProperties_3_0= rulePathNameCS )
                    	    // InternalQVTimperative.g:3018:3: lv_observedProperties_3_0= rulePathNameCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getSetStatementCSAccess().getObservedPropertiesPathNameCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_62);
                    	    lv_observedProperties_3_0=rulePathNameCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getSetStatementCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"observedProperties",
                    	              		lv_observedProperties_3_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:3034:6: ( (lv_isNotify_4_0= 'notify' ) )?
            int alt69=2;
            int LA69_0 = input.LA(1);

            if ( (LA69_0==59) ) {
                alt69=1;
            }
            switch (alt69) {
                case 1 :
                    // InternalQVTimperative.g:3035:1: (lv_isNotify_4_0= 'notify' )
                    {
                    // InternalQVTimperative.g:3035:1: (lv_isNotify_4_0= 'notify' )
                    // InternalQVTimperative.g:3036:3: lv_isNotify_4_0= 'notify'
                    {
                    lv_isNotify_4_0=(Token)match(input,59,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isNotify_4_0, grammarAccess.getSetStatementCSAccess().getIsNotifyNotifyKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getSetStatementCSRule());
                      	        }
                             		setWithLastConsumed(current, "isNotify", true, "notify");

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getSetStatementCSAccess().getSetKeyword_2());

            }
            // InternalQVTimperative.g:3053:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3054:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3054:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:3055:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getSetStatementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSetStatementCSAccess().getReferredVariableVariableDeclarationCrossReference_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_64);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getSetStatementCSAccess().getFullStopKeyword_4());

            }
            // InternalQVTimperative.g:3075:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3076:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3076:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:3077:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getSetStatementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSetStatementCSAccess().getReferredPropertyPropertyCrossReference_5_0());

            }
            pushFollow(FollowSets000.FOLLOW_65);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:3093:2: (otherlv_9= ':=' | ( (lv_isPartial_10_0= '+=' ) ) )
            int alt70=2;
            int LA70_0 = input.LA(1);

            if ( (LA70_0==28) ) {
                alt70=1;
            }
            else if ( (LA70_0==20) ) {
                alt70=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 70, 0, input);

                throw nvae;
            }
            switch (alt70) {
                case 1 :
                    // InternalQVTimperative.g:3093:4: otherlv_9= ':='
                    {
                    otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getSetStatementCSAccess().getColonEqualsSignKeyword_6_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:3098:6: ( (lv_isPartial_10_0= '+=' ) )
                    {
                    // InternalQVTimperative.g:3098:6: ( (lv_isPartial_10_0= '+=' ) )
                    // InternalQVTimperative.g:3099:1: (lv_isPartial_10_0= '+=' )
                    {
                    // InternalQVTimperative.g:3099:1: (lv_isPartial_10_0= '+=' )
                    // InternalQVTimperative.g:3100:3: lv_isPartial_10_0= '+='
                    {
                    lv_isPartial_10_0=(Token)match(input,20,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isPartial_10_0, grammarAccess.getSetStatementCSAccess().getIsPartialPlusSignEqualsSignKeyword_6_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getSetStatementCSRule());
                      	        }
                             		setWithLastConsumed(current, "isPartial", true, "+=");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:3113:3: ( (lv_ownedExpression_11_0= ruleExpCS ) )
            // InternalQVTimperative.g:3114:1: (lv_ownedExpression_11_0= ruleExpCS )
            {
            // InternalQVTimperative.g:3114:1: (lv_ownedExpression_11_0= ruleExpCS )
            // InternalQVTimperative.g:3115:3: lv_ownedExpression_11_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSetStatementCSAccess().getOwnedExpressionExpCSParserRuleCall_7_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedExpression_11_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSetStatementCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedExpression",
                      		lv_ownedExpression_11_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_12, grammarAccess.getSetStatementCSAccess().getSemicolonKeyword_8());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSimpleParameterBindingCS"
    // InternalQVTimperative.g:3143:1: entryRuleSimpleParameterBindingCS returns [EObject current=null] : iv_ruleSimpleParameterBindingCS= ruleSimpleParameterBindingCS EOF ;
    public final EObject entryRuleSimpleParameterBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSimpleParameterBindingCS = null;


        try {
            // InternalQVTimperative.g:3144:2: (iv_ruleSimpleParameterBindingCS= ruleSimpleParameterBindingCS EOF )
            // InternalQVTimperative.g:3145:2: iv_ruleSimpleParameterBindingCS= ruleSimpleParameterBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSimpleParameterBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSimpleParameterBindingCS=ruleSimpleParameterBindingCS();

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

            }

        }

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


    // $ANTLR start "ruleSimpleParameterBindingCS"
    // InternalQVTimperative.g:3152:1: ruleSimpleParameterBindingCS returns [EObject current=null] : ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'uses' ( (lv_ownedValue_3_0= ruleExpCS ) ) otherlv_4= ';' ) ;
    public final EObject ruleSimpleParameterBindingCS() throws RecognitionException {
        EObject current = null;

        Token lv_isCheck_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedValue_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3155:28: ( ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'uses' ( (lv_ownedValue_3_0= ruleExpCS ) ) otherlv_4= ';' ) )
            // InternalQVTimperative.g:3156:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'uses' ( (lv_ownedValue_3_0= ruleExpCS ) ) otherlv_4= ';' )
            {
            // InternalQVTimperative.g:3156:1: ( ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'uses' ( (lv_ownedValue_3_0= ruleExpCS ) ) otherlv_4= ';' )
            // InternalQVTimperative.g:3156:2: ( (lv_isCheck_0_0= 'check' ) )? ( ( ruleUnrestrictedName ) ) otherlv_2= 'uses' ( (lv_ownedValue_3_0= ruleExpCS ) ) otherlv_4= ';'
            {
            // InternalQVTimperative.g:3156:2: ( (lv_isCheck_0_0= 'check' ) )?
            int alt71=2;
            alt71 = dfa71.predict(input);
            switch (alt71) {
                case 1 :
                    // InternalQVTimperative.g:3157:1: (lv_isCheck_0_0= 'check' )
                    {
                    // InternalQVTimperative.g:3157:1: (lv_isCheck_0_0= 'check' )
                    // InternalQVTimperative.g:3158:3: lv_isCheck_0_0= 'check'
                    {
                    lv_isCheck_0_0=(Token)match(input,29,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isCheck_0_0, grammarAccess.getSimpleParameterBindingCSAccess().getIsCheckCheckKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getSimpleParameterBindingCSRule());
                      	        }
                             		setWithLastConsumed(current, "isCheck", true, "check");

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:3171:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3172:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3172:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:3173:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getSimpleParameterBindingCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleParameterBindingCSAccess().getReferredVariableSimpleParameterCrossReference_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_66);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,62,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getSimpleParameterBindingCSAccess().getUsesKeyword_2());

            }
            // InternalQVTimperative.g:3193:1: ( (lv_ownedValue_3_0= ruleExpCS ) )
            // InternalQVTimperative.g:3194:1: (lv_ownedValue_3_0= ruleExpCS )
            {
            // InternalQVTimperative.g:3194:1: (lv_ownedValue_3_0= ruleExpCS )
            // InternalQVTimperative.g:3195:3: lv_ownedValue_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleParameterBindingCSAccess().getOwnedValueExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedValue_3_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSimpleParameterBindingCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedValue",
                      		lv_ownedValue_3_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getSimpleParameterBindingCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSimpleParameterCS"
    // InternalQVTimperative.g:3223:1: entryRuleSimpleParameterCS returns [EObject current=null] : iv_ruleSimpleParameterCS= ruleSimpleParameterCS EOF ;
    public final EObject entryRuleSimpleParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSimpleParameterCS = null;


        try {
            // InternalQVTimperative.g:3224:2: (iv_ruleSimpleParameterCS= ruleSimpleParameterCS EOF )
            // InternalQVTimperative.g:3225:2: iv_ruleSimpleParameterCS= ruleSimpleParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSimpleParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSimpleParameterCS=ruleSimpleParameterCS();

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

            }

        }

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


    // $ANTLR start "ruleSimpleParameterCS"
    // InternalQVTimperative.g:3232:1: ruleSimpleParameterCS returns [EObject current=null] : (otherlv_0= 'in' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) otherlv_6= ';' ) ;
    public final EObject ruleSimpleParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        AntlrDatatypeRuleToken lv_name_3_0 = null;

        EObject lv_ownedType_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3235:28: ( (otherlv_0= 'in' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) otherlv_6= ';' ) )
            // InternalQVTimperative.g:3236:1: (otherlv_0= 'in' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) otherlv_6= ';' )
            {
            // InternalQVTimperative.g:3236:1: (otherlv_0= 'in' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) otherlv_6= ';' )
            // InternalQVTimperative.g:3236:3: otherlv_0= 'in' otherlv_1= ':' ( ( ruleUnrestrictedName ) ) ( (lv_name_3_0= ruleUnrestrictedName ) ) otherlv_4= ':' ( (lv_ownedType_5_0= ruleTypeExpCS ) ) otherlv_6= ';'
            {
            otherlv_0=(Token)match(input,49,FollowSets000.FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getSimpleParameterCSAccess().getInKeyword_0());

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

                  	newLeafNode(otherlv_1, grammarAccess.getSimpleParameterCSAccess().getColonKeyword_1());

            }
            // InternalQVTimperative.g:3244:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3245:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3245:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:3246:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getSimpleParameterCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleParameterCSAccess().getReferredTypedModelTypedModelCrossReference_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_5);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:3262:2: ( (lv_name_3_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3263:1: (lv_name_3_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3263:1: (lv_name_3_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:3264:3: lv_name_3_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleParameterCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_3_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSimpleParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_3_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_4, grammarAccess.getSimpleParameterCSAccess().getColonKeyword_4());

            }
            // InternalQVTimperative.g:3284:1: ( (lv_ownedType_5_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:3285:1: (lv_ownedType_5_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:3285:1: (lv_ownedType_5_0= ruleTypeExpCS )
            // InternalQVTimperative.g:3286:3: lv_ownedType_5_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleParameterCSAccess().getOwnedTypeTypeExpCSParserRuleCall_5_0());

            }
            pushFollow(FollowSets000.FOLLOW_9);
            lv_ownedType_5_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSimpleParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_5_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_6, grammarAccess.getSimpleParameterCSAccess().getSemicolonKeyword_6());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSpeculateStatementCS"
    // InternalQVTimperative.g:3314:1: entryRuleSpeculateStatementCS returns [EObject current=null] : iv_ruleSpeculateStatementCS= ruleSpeculateStatementCS EOF ;
    public final EObject entryRuleSpeculateStatementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSpeculateStatementCS = null;


        try {
            // InternalQVTimperative.g:3315:2: (iv_ruleSpeculateStatementCS= ruleSpeculateStatementCS EOF )
            // InternalQVTimperative.g:3316:2: iv_ruleSpeculateStatementCS= ruleSpeculateStatementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSpeculateStatementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSpeculateStatementCS=ruleSpeculateStatementCS();

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

            }

        }

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


    // $ANTLR start "ruleSpeculateStatementCS"
    // InternalQVTimperative.g:3323:1: ruleSpeculateStatementCS returns [EObject current=null] : (otherlv_0= 'speculate' ( (lv_ownedConditions_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )* otherlv_4= ';' ) ;
    public final EObject ruleSpeculateStatementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedConditions_1_0 = null;

        EObject lv_ownedConditions_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3326:28: ( (otherlv_0= 'speculate' ( (lv_ownedConditions_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )* otherlv_4= ';' ) )
            // InternalQVTimperative.g:3327:1: (otherlv_0= 'speculate' ( (lv_ownedConditions_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )* otherlv_4= ';' )
            {
            // InternalQVTimperative.g:3327:1: (otherlv_0= 'speculate' ( (lv_ownedConditions_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )* otherlv_4= ';' )
            // InternalQVTimperative.g:3327:3: otherlv_0= 'speculate' ( (lv_ownedConditions_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )* otherlv_4= ';'
            {
            otherlv_0=(Token)match(input,63,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getSpeculateStatementCSAccess().getSpeculateKeyword_0());

            }
            // InternalQVTimperative.g:3331:1: ( (lv_ownedConditions_1_0= ruleExpCS ) )
            // InternalQVTimperative.g:3332:1: (lv_ownedConditions_1_0= ruleExpCS )
            {
            // InternalQVTimperative.g:3332:1: (lv_ownedConditions_1_0= ruleExpCS )
            // InternalQVTimperative.g:3333:3: lv_ownedConditions_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSpeculateStatementCSAccess().getOwnedConditionsExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_67);
            lv_ownedConditions_1_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSpeculateStatementCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedConditions",
                      		lv_ownedConditions_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:3349:2: (otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) ) )*
            loop72:
            do {
                int alt72=2;
                int LA72_0 = input.LA(1);

                if ( (LA72_0==18) ) {
                    alt72=1;
                }


                switch (alt72) {
            	case 1 :
            	    // InternalQVTimperative.g:3349:4: otherlv_2= ',' ( (lv_ownedConditions_3_0= ruleExpCS ) )
            	    {
            	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getSpeculateStatementCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTimperative.g:3353:1: ( (lv_ownedConditions_3_0= ruleExpCS ) )
            	    // InternalQVTimperative.g:3354:1: (lv_ownedConditions_3_0= ruleExpCS )
            	    {
            	    // InternalQVTimperative.g:3354:1: (lv_ownedConditions_3_0= ruleExpCS )
            	    // InternalQVTimperative.g:3355:3: lv_ownedConditions_3_0= ruleExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getSpeculateStatementCSAccess().getOwnedConditionsExpCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_67);
            	    lv_ownedConditions_3_0=ruleExpCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getSpeculateStatementCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedConditions",
            	              		lv_ownedConditions_3_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

                  	newLeafNode(otherlv_4, grammarAccess.getSpeculateStatementCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTransformationCS"
    // InternalQVTimperative.g:3383:1: entryRuleTransformationCS returns [EObject current=null] : iv_ruleTransformationCS= ruleTransformationCS EOF ;
    public final EObject entryRuleTransformationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTransformationCS = null;


        try {
            // InternalQVTimperative.g:3384:2: (iv_ruleTransformationCS= ruleTransformationCS EOF )
            // InternalQVTimperative.g:3385:2: iv_ruleTransformationCS= ruleTransformationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTransformationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTransformationCS=ruleTransformationCS();

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

            }

        }

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


    // $ANTLR start "ruleTransformationCS"
    // InternalQVTimperative.g:3392:1: ruleTransformationCS returns [EObject current=null] : (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnreservedName ) ) (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )? otherlv_5= '{' ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )* ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )* otherlv_10= '}' ) ;
    public final EObject ruleTransformationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_10=null;
        EObject lv_ownedPathName_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedContextType_4_0 = null;

        EObject lv_ownedDirections_6_0 = null;

        EObject lv_ownedMappings_8_1 = null;

        EObject lv_ownedMappings_8_2 = null;

        EObject lv_ownedQueries_9_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3395:28: ( (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnreservedName ) ) (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )? otherlv_5= '{' ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )* ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )* otherlv_10= '}' ) )
            // InternalQVTimperative.g:3396:1: (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnreservedName ) ) (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )? otherlv_5= '{' ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )* ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )* otherlv_10= '}' )
            {
            // InternalQVTimperative.g:3396:1: (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnreservedName ) ) (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )? otherlv_5= '{' ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )* ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )* otherlv_10= '}' )
            // InternalQVTimperative.g:3396:3: otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnreservedName ) ) (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )? otherlv_5= '{' ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )* ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )* otherlv_10= '}'
            {
            otherlv_0=(Token)match(input,64,FollowSets000.FOLLOW_12); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getTransformationCSAccess().getTransformationKeyword_0());

            }
            // InternalQVTimperative.g:3400:1: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?
            int alt73=2;
            alt73 = dfa73.predict(input);
            switch (alt73) {
                case 1 :
                    // InternalQVTimperative.g:3401:1: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    {
                    // InternalQVTimperative.g:3401:1: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    // InternalQVTimperative.g:3402:3: lv_ownedPathName_1_0= ruleScopeNameCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedPathNameScopeNameCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_12);
                    lv_ownedPathName_1_0=ruleScopeNameCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedPathName",
                              		lv_ownedPathName_1_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.ScopeNameCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:3418:3: ( (lv_name_2_0= ruleUnreservedName ) )
            // InternalQVTimperative.g:3419:1: (lv_name_2_0= ruleUnreservedName )
            {
            // InternalQVTimperative.g:3419:1: (lv_name_2_0= ruleUnreservedName )
            // InternalQVTimperative.g:3420:3: lv_name_2_0= ruleUnreservedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTransformationCSAccess().getNameUnreservedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_68);
            lv_name_2_0=ruleUnreservedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.UnreservedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:3436:2: (otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) ) )?
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( (LA74_0==24) ) {
                alt74=1;
            }
            switch (alt74) {
                case 1 :
                    // InternalQVTimperative.g:3436:4: otherlv_3= ':' ( (lv_ownedContextType_4_0= ruleTypeExpCS ) )
                    {
                    otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getTransformationCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:3440:1: ( (lv_ownedContextType_4_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:3441:1: (lv_ownedContextType_4_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:3441:1: (lv_ownedContextType_4_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:3442:3: lv_ownedContextType_4_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedContextTypeTypeExpCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_41);
                    lv_ownedContextType_4_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedContextType",
                              		lv_ownedContextType_4_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getTransformationCSAccess().getLeftCurlyBracketKeyword_4());

            }
            // InternalQVTimperative.g:3462:1: ( ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';' )*
            loop75:
            do {
                int alt75=2;
                int LA75_0 = input.LA(1);

                if ( (LA75_0==EOF||(LA75_0>=RULE_SIMPLE_ID && LA75_0<=RULE_ESCAPED_ID)||LA75_0==21||LA75_0==31) ) {
                    alt75=1;
                }


                switch (alt75) {
            	case 1 :
            	    // InternalQVTimperative.g:3462:2: ( (lv_ownedDirections_6_0= ruleDirectionCS ) ) otherlv_7= ';'
            	    {
            	    // InternalQVTimperative.g:3462:2: ( (lv_ownedDirections_6_0= ruleDirectionCS ) )
            	    // InternalQVTimperative.g:3463:1: (lv_ownedDirections_6_0= ruleDirectionCS )
            	    {
            	    // InternalQVTimperative.g:3463:1: (lv_ownedDirections_6_0= ruleDirectionCS )
            	    // InternalQVTimperative.g:3464:3: lv_ownedDirections_6_0= ruleDirectionCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedDirectionsDirectionCSParserRuleCall_5_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_9);
            	    lv_ownedDirections_6_0=ruleDirectionCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedDirections",
            	              		lv_ownedDirections_6_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.DirectionCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }

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

            	          	newLeafNode(otherlv_7, grammarAccess.getTransformationCSAccess().getSemicolonKeyword_5_1());

            	    }

            	    }
            	    break;

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

            // InternalQVTimperative.g:3484:3: ( ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) ) | ( (lv_ownedQueries_9_0= ruleQueryCS ) ) )*
            loop77:
            do {
                int alt77=3;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==25||LA77_0==32||LA77_0==44) ) {
                    alt77=1;
                }
                else if ( ((LA77_0>=54 && LA77_0<=55)) ) {
                    alt77=2;
                }


                switch (alt77) {
            	case 1 :
            	    // InternalQVTimperative.g:3484:4: ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) )
            	    {
            	    // InternalQVTimperative.g:3484:4: ( ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) ) )
            	    // InternalQVTimperative.g:3485:1: ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) )
            	    {
            	    // InternalQVTimperative.g:3485:1: ( (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS ) )
            	    // InternalQVTimperative.g:3486:1: (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS )
            	    {
            	    // InternalQVTimperative.g:3486:1: (lv_ownedMappings_8_1= ruleEntryPointCS | lv_ownedMappings_8_2= ruleMappingCS )
            	    int alt76=2;
            	    switch ( input.LA(1) ) {
            	    case 25:
            	        {
            	        int LA76_1 = input.LA(2);

            	        if ( (LA76_1==32) ) {
            	            alt76=1;
            	        }
            	        else if ( (LA76_1==44) ) {
            	            alt76=2;
            	        }
            	        else {
            	            if (state.backtracking>0) {state.failed=true; return current;}
            	            NoViableAltException nvae =
            	                new NoViableAltException("", 76, 1, input);

            	            throw nvae;
            	        }
            	        }
            	        break;
            	    case 32:
            	        {
            	        alt76=1;
            	        }
            	        break;
            	    case 44:
            	        {
            	        alt76=2;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 76, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt76) {
            	        case 1 :
            	            // InternalQVTimperative.g:3487:3: lv_ownedMappings_8_1= ruleEntryPointCS
            	            {
            	            if ( state.backtracking==0 ) {

            	              	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedMappingsEntryPointCSParserRuleCall_6_0_0_0());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_70);
            	            lv_ownedMappings_8_1=ruleEntryPointCS();

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

            	              	        if (current==null) {
            	              	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	              	        }
            	                     		add(
            	                     			current,
            	                     			"ownedMappings",
            	                      		lv_ownedMappings_8_1,
            	                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.EntryPointCS");
            	              	        afterParserOrEnumRuleCall();

            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalQVTimperative.g:3502:8: lv_ownedMappings_8_2= ruleMappingCS
            	            {
            	            if ( state.backtracking==0 ) {

            	              	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedMappingsMappingCSParserRuleCall_6_0_0_1());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_70);
            	            lv_ownedMappings_8_2=ruleMappingCS();

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

            	              	        if (current==null) {
            	              	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	              	        }
            	                     		add(
            	                     			current,
            	                     			"ownedMappings",
            	                      		lv_ownedMappings_8_2,
            	                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.MappingCS");
            	              	        afterParserOrEnumRuleCall();

            	            }

            	            }
            	            break;

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalQVTimperative.g:3521:6: ( (lv_ownedQueries_9_0= ruleQueryCS ) )
            	    {
            	    // InternalQVTimperative.g:3521:6: ( (lv_ownedQueries_9_0= ruleQueryCS ) )
            	    // InternalQVTimperative.g:3522:1: (lv_ownedQueries_9_0= ruleQueryCS )
            	    {
            	    // InternalQVTimperative.g:3522:1: (lv_ownedQueries_9_0= ruleQueryCS )
            	    // InternalQVTimperative.g:3523:3: lv_ownedQueries_9_0= ruleQueryCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedQueriesQueryCSParserRuleCall_6_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_70);
            	    lv_ownedQueries_9_0=ruleQueryCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedQueries",
            	              		lv_ownedQueries_9_0,
            	              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.QueryCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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

            otherlv_10=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_10, grammarAccess.getTransformationCSAccess().getRightCurlyBracketKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleQVTimperativeUnrestrictedName"
    // InternalQVTimperative.g:3551:1: entryRuleQVTimperativeUnrestrictedName returns [String current=null] : iv_ruleQVTimperativeUnrestrictedName= ruleQVTimperativeUnrestrictedName EOF ;
    public final String entryRuleQVTimperativeUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQVTimperativeUnrestrictedName = null;


        try {
            // InternalQVTimperative.g:3552:2: (iv_ruleQVTimperativeUnrestrictedName= ruleQVTimperativeUnrestrictedName EOF )
            // InternalQVTimperative.g:3553:2: iv_ruleQVTimperativeUnrestrictedName= ruleQVTimperativeUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQVTimperativeUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQVTimperativeUnrestrictedName=ruleQVTimperativeUnrestrictedName();

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

            }

        }

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


    // $ANTLR start "ruleQVTimperativeUnrestrictedName"
    // InternalQVTimperative.g:3560:1: ruleQVTimperativeUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'add' | kw= 'append' | kw= 'appendsTo' | kw= 'buffer' | kw= 'call' | kw= 'check' | kw= 'contained' | kw= 'entry' | kw= 'for' | kw= 'implementedby' | kw= 'imports' | kw= 'input' | kw= 'install' | kw= 'invoke' | kw= 'iterates' | kw= 'map' | kw= 'new' | kw= 'notify' | kw= 'observe' | kw= 'output' | kw= 'package' | kw= 'query' | kw= 'set' | kw= 'speculate' | kw= 'strict' | kw= 'success' | kw= 'target' | kw= 'transformation' | kw= 'transient' | kw= 'uses' | kw= 'var' | kw= 'via' ) ;
    public final AntlrDatatypeRuleToken ruleQVTimperativeUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:3563:28: ( (kw= 'add' | kw= 'append' | kw= 'appendsTo' | kw= 'buffer' | kw= 'call' | kw= 'check' | kw= 'contained' | kw= 'entry' | kw= 'for' | kw= 'implementedby' | kw= 'imports' | kw= 'input' | kw= 'install' | kw= 'invoke' | kw= 'iterates' | kw= 'map' | kw= 'new' | kw= 'notify' | kw= 'observe' | kw= 'output' | kw= 'package' | kw= 'query' | kw= 'set' | kw= 'speculate' | kw= 'strict' | kw= 'success' | kw= 'target' | kw= 'transformation' | kw= 'transient' | kw= 'uses' | kw= 'var' | kw= 'via' ) )
            // InternalQVTimperative.g:3564:1: (kw= 'add' | kw= 'append' | kw= 'appendsTo' | kw= 'buffer' | kw= 'call' | kw= 'check' | kw= 'contained' | kw= 'entry' | kw= 'for' | kw= 'implementedby' | kw= 'imports' | kw= 'input' | kw= 'install' | kw= 'invoke' | kw= 'iterates' | kw= 'map' | kw= 'new' | kw= 'notify' | kw= 'observe' | kw= 'output' | kw= 'package' | kw= 'query' | kw= 'set' | kw= 'speculate' | kw= 'strict' | kw= 'success' | kw= 'target' | kw= 'transformation' | kw= 'transient' | kw= 'uses' | kw= 'var' | kw= 'via' )
            {
            // InternalQVTimperative.g:3564:1: (kw= 'add' | kw= 'append' | kw= 'appendsTo' | kw= 'buffer' | kw= 'call' | kw= 'check' | kw= 'contained' | kw= 'entry' | kw= 'for' | kw= 'implementedby' | kw= 'imports' | kw= 'input' | kw= 'install' | kw= 'invoke' | kw= 'iterates' | kw= 'map' | kw= 'new' | kw= 'notify' | kw= 'observe' | kw= 'output' | kw= 'package' | kw= 'query' | kw= 'set' | kw= 'speculate' | kw= 'strict' | kw= 'success' | kw= 'target' | kw= 'transformation' | kw= 'transient' | kw= 'uses' | kw= 'var' | kw= 'via' )
            int alt78=32;
            switch ( input.LA(1) ) {
            case 19:
                {
                alt78=1;
                }
                break;
            case 23:
                {
                alt78=2;
                }
                break;
            case 22:
                {
                alt78=3;
                }
                break;
            case 26:
                {
                alt78=4;
                }
                break;
            case 45:
                {
                alt78=5;
                }
                break;
            case 29:
                {
                alt78=6;
                }
                break;
            case 50:
                {
                alt78=7;
                }
                break;
            case 32:
                {
                alt78=8;
                }
                break;
            case 48:
                {
                alt78=9;
                }
                break;
            case 58:
                {
                alt78=10;
                }
                break;
            case 31:
                {
                alt78=11;
                }
                break;
            case 33:
                {
                alt78=12;
                }
                break;
            case 46:
                {
                alt78=13;
                }
                break;
            case 47:
                {
                alt78=14;
                }
                break;
            case 43:
                {
                alt78=15;
                }
                break;
            case 44:
                {
                alt78=16;
                }
                break;
            case 51:
                {
                alt78=17;
                }
                break;
            case 59:
                {
                alt78=18;
                }
                break;
            case 17:
                {
                alt78=19;
                }
                break;
            case 34:
                {
                alt78=20;
                }
                break;
            case 52:
                {
                alt78=21;
                }
                break;
            case 55:
                {
                alt78=22;
                }
                break;
            case 60:
                {
                alt78=23;
                }
                break;
            case 63:
                {
                alt78=24;
                }
                break;
            case 25:
                {
                alt78=25;
                }
                break;
            case 39:
                {
                alt78=26;
                }
                break;
            case 65:
                {
                alt78=27;
                }
                break;
            case 64:
                {
                alt78=28;
                }
                break;
            case 54:
                {
                alt78=29;
                }
                break;
            case 62:
                {
                alt78=30;
                }
                break;
            case 30:
                {
                alt78=31;
                }
                break;
            case 66:
                {
                alt78=32;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 78, 0, input);

                throw nvae;
            }

            switch (alt78) {
                case 1 :
                    // InternalQVTimperative.g:3565:2: kw= 'add'
                    {
                    kw=(Token)match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getAddKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:3572:2: kw= 'append'
                    {
                    kw=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getAppendKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:3579:2: kw= 'appendsTo'
                    {
                    kw=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getAppendsToKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:3586:2: kw= 'buffer'
                    {
                    kw=(Token)match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getBufferKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:3593:2: kw= 'call'
                    {
                    kw=(Token)match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getCallKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:3600:2: kw= 'check'
                    {
                    kw=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getCheckKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTimperative.g:3607:2: kw= 'contained'
                    {
                    kw=(Token)match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getContainedKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTimperative.g:3614:2: kw= 'entry'
                    {
                    kw=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getEntryKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTimperative.g:3621:2: kw= 'for'
                    {
                    kw=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getForKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTimperative.g:3628:2: kw= 'implementedby'
                    {
                    kw=(Token)match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getImplementedbyKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTimperative.g:3635:2: kw= 'imports'
                    {
                    kw=(Token)match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getImportsKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTimperative.g:3642:2: kw= 'input'
                    {
                    kw=(Token)match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getInputKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTimperative.g:3649:2: kw= 'install'
                    {
                    kw=(Token)match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getInstallKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTimperative.g:3656:2: kw= 'invoke'
                    {
                    kw=(Token)match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getInvokeKeyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTimperative.g:3663:2: kw= 'iterates'
                    {
                    kw=(Token)match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getIteratesKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTimperative.g:3670:2: kw= 'map'
                    {
                    kw=(Token)match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getMapKeyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTimperative.g:3677:2: kw= 'new'
                    {
                    kw=(Token)match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getNewKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTimperative.g:3684:2: kw= 'notify'
                    {
                    kw=(Token)match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getNotifyKeyword_17());

                    }

                    }
                    break;
                case 19 :
                    // InternalQVTimperative.g:3691:2: kw= 'observe'
                    {
                    kw=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getObserveKeyword_18());

                    }

                    }
                    break;
                case 20 :
                    // InternalQVTimperative.g:3698:2: kw= 'output'
                    {
                    kw=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getOutputKeyword_19());

                    }

                    }
                    break;
                case 21 :
                    // InternalQVTimperative.g:3705:2: kw= 'package'
                    {
                    kw=(Token)match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getPackageKeyword_20());

                    }

                    }
                    break;
                case 22 :
                    // InternalQVTimperative.g:3712:2: kw= 'query'
                    {
                    kw=(Token)match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getQueryKeyword_21());

                    }

                    }
                    break;
                case 23 :
                    // InternalQVTimperative.g:3719:2: kw= 'set'
                    {
                    kw=(Token)match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getSetKeyword_22());

                    }

                    }
                    break;
                case 24 :
                    // InternalQVTimperative.g:3726:2: kw= 'speculate'
                    {
                    kw=(Token)match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getSpeculateKeyword_23());

                    }

                    }
                    break;
                case 25 :
                    // InternalQVTimperative.g:3733:2: kw= 'strict'
                    {
                    kw=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getStrictKeyword_24());

                    }

                    }
                    break;
                case 26 :
                    // InternalQVTimperative.g:3740:2: kw= 'success'
                    {
                    kw=(Token)match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getSuccessKeyword_25());

                    }

                    }
                    break;
                case 27 :
                    // InternalQVTimperative.g:3747:2: kw= 'target'
                    {
                    kw=(Token)match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getTargetKeyword_26());

                    }

                    }
                    break;
                case 28 :
                    // InternalQVTimperative.g:3754:2: kw= 'transformation'
                    {
                    kw=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getTransformationKeyword_27());

                    }

                    }
                    break;
                case 29 :
                    // InternalQVTimperative.g:3761:2: kw= 'transient'
                    {
                    kw=(Token)match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getTransientKeyword_28());

                    }

                    }
                    break;
                case 30 :
                    // InternalQVTimperative.g:3768:2: kw= 'uses'
                    {
                    kw=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getUsesKeyword_29());

                    }

                    }
                    break;
                case 31 :
                    // InternalQVTimperative.g:3775:2: kw= 'var'
                    {
                    kw=(Token)match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getVarKeyword_30());

                    }

                    }
                    break;
                case 32 :
                    // InternalQVTimperative.g:3782:2: kw= 'via'
                    {
                    kw=(Token)match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTimperativeUnrestrictedNameAccess().getViaKeyword_31());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleUnrestrictedName"
    // InternalQVTimperative.g:3795:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
    public final String entryRuleUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnrestrictedName = null;


        try {
            // InternalQVTimperative.g:3796:2: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
            // InternalQVTimperative.g:3797:2: iv_ruleUnrestrictedName= ruleUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnrestrictedName=ruleUnrestrictedName();

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

            }

        }

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


    // $ANTLR start "ruleUnrestrictedName"
    // InternalQVTimperative.g:3804:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTimperativeUnrestrictedName_2= ruleQVTimperativeUnrestrictedName ) ;
    public final AntlrDatatypeRuleToken ruleUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnrestrictedName_0 = null;

        AntlrDatatypeRuleToken this_QVTbaseUnrestrictedName_1 = null;

        AntlrDatatypeRuleToken this_QVTimperativeUnrestrictedName_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3807:28: ( (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTimperativeUnrestrictedName_2= ruleQVTimperativeUnrestrictedName ) )
            // InternalQVTimperative.g:3808:1: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTimperativeUnrestrictedName_2= ruleQVTimperativeUnrestrictedName )
            {
            // InternalQVTimperative.g:3808:1: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTimperativeUnrestrictedName_2= ruleQVTimperativeUnrestrictedName )
            int alt79=3;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
                {
                alt79=1;
                }
                break;
            case 67:
            case 68:
            case 69:
            case 70:
            case 72:
            case 74:
            case 76:
            case 79:
            case 81:
            case 83:
            case 85:
            case 86:
            case 87:
            case 88:
            case 89:
            case 91:
            case 92:
            case 93:
            case 94:
            case 95:
            case 96:
            case 98:
            case 100:
            case 102:
            case 103:
            case 104:
            case 105:
                {
                alt79=2;
                }
                break;
            case 54:
                {
                int LA79_3 = input.LA(2);

                if ( (synpred122_InternalQVTimperative()) ) {
                    alt79=2;
                }
                else if ( (true) ) {
                    alt79=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 79, 3, input);

                    throw nvae;
                }
                }
                break;
            case 17:
            case 19:
            case 22:
            case 23:
            case 25:
            case 26:
            case 29:
            case 30:
            case 31:
            case 32:
            case 33:
            case 34:
            case 39:
            case 43:
            case 44:
            case 45:
            case 46:
            case 47:
            case 48:
            case 50:
            case 51:
            case 52:
            case 55:
            case 58:
            case 59:
            case 60:
            case 62:
            case 63:
            case 64:
            case 65:
            case 66:
                {
                alt79=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 79, 0, input);

                throw nvae;
            }

            switch (alt79) {
                case 1 :
                    // InternalQVTimperative.g:3809:5: this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EssentialOCLUnrestrictedName_0=ruleEssentialOCLUnrestrictedName();

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

                      		current.merge(this_EssentialOCLUnrestrictedName_0);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:3821:5: this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTbaseUnrestrictedNameParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QVTbaseUnrestrictedName_1=ruleQVTbaseUnrestrictedName();

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

                      		current.merge(this_QVTbaseUnrestrictedName_1);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:3833:5: this_QVTimperativeUnrestrictedName_2= ruleQVTimperativeUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTimperativeUnrestrictedNameParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QVTimperativeUnrestrictedName_2=ruleQVTimperativeUnrestrictedName();

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

                      		current.merge(this_QVTimperativeUnrestrictedName_2);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleAttributeCS"
    // InternalQVTimperative.g:3851:1: entryRuleAttributeCS returns [EObject current=null] : iv_ruleAttributeCS= ruleAttributeCS EOF ;
    public final EObject entryRuleAttributeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeCS = null;


        try {
            // InternalQVTimperative.g:3852:2: (iv_ruleAttributeCS= ruleAttributeCS EOF )
            // InternalQVTimperative.g:3853:2: iv_ruleAttributeCS= ruleAttributeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAttributeCS=ruleAttributeCS();

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

            }

        }

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


    // $ANTLR start "ruleAttributeCS"
    // InternalQVTimperative.g:3860:1: ruleAttributeCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) ) ;
    public final EObject ruleAttributeCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token lv_default_9_0=null;
        Token otherlv_10=null;
        Token lv_qualifiers_11_0=null;
        Token lv_qualifiers_12_0=null;
        Token lv_qualifiers_13_0=null;
        Token lv_qualifiers_14_0=null;
        Token lv_qualifiers_15_0=null;
        Token lv_qualifiers_16_0=null;
        Token lv_qualifiers_17_0=null;
        Token lv_qualifiers_18_0=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token lv_qualifiers_25_0=null;
        Token lv_qualifiers_26_0=null;
        Token otherlv_27=null;
        Token otherlv_28=null;
        Token otherlv_29=null;
        Token otherlv_30=null;
        Token otherlv_32=null;
        Token otherlv_34=null;
        Token otherlv_35=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        Token otherlv_40=null;
        Token otherlv_41=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedDefaultExpressions_33_0 = null;

        EObject lv_ownedDefaultExpressions_38_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:3863:28: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) ) )
            // InternalQVTimperative.g:3864:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) )
            {
            // InternalQVTimperative.g:3864:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) )
            // InternalQVTimperative.g:3864:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' )
            {
            // InternalQVTimperative.g:3864:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt82=3;
            int LA82_0 = input.LA(1);

            if ( (LA82_0==67) ) {
                alt82=1;
            }
            else if ( (LA82_0==68) ) {
                alt82=2;
            }
            switch (alt82) {
                case 1 :
                    // InternalQVTimperative.g:3864:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTimperative.g:3864:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTimperative.g:3864:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTimperative.g:3864:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTimperative.g:3865:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTimperative.g:3865:1: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTimperative.g:3866:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,67,FollowSets000.FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_0_0, grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getAttributeCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTimperative.g:3879:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt80=2;
                    int LA80_0 = input.LA(1);

                    if ( (LA80_0==68) ) {
                        alt80=1;
                    }
                    switch (alt80) {
                        case 1 :
                            // InternalQVTimperative.g:3880:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTimperative.g:3880:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTimperative.g:3881:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,68,FollowSets000.FOLLOW_72); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_1_0, grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:3895:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTimperative.g:3895:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTimperative.g:3895:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTimperative.g:3895:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTimperative.g:3896:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTimperative.g:3896:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTimperative.g:3897:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,68,FollowSets000.FOLLOW_73); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_2_0, grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getAttributeCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTimperative.g:3910:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt81=2;
                    int LA81_0 = input.LA(1);

                    if ( (LA81_0==67) ) {
                        alt81=1;
                    }
                    switch (alt81) {
                        case 1 :
                            // InternalQVTimperative.g:3911:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTimperative.g:3911:1: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTimperative.g:3912:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,67,FollowSets000.FOLLOW_72); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_3_0, grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,69,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());

            }
            // InternalQVTimperative.g:3929:1: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:3930:1: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:3930:1: (lv_name_5_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:3931:3: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_49);
            lv_name_5_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getAttributeCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_5_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:3947:2: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( (LA83_0==24) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalQVTimperative.g:3947:4: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_6=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:3951:1: ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTimperative.g:3952:1: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTimperative.g:3952:1: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTimperative.g:3953:3: lv_ownedType_7_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_50);
                    lv_ownedType_7_0=ruleTypedMultiplicityRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_7_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:3969:4: (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( (LA84_0==53) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // InternalQVTimperative.g:3969:6: otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,53,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());

                    }
                    // InternalQVTimperative.g:3973:1: ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:3974:1: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:3974:1: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:3975:3: lv_default_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_default_9_0, grammarAccess.getAttributeCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getAttributeCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"default",
                              		lv_default_9_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:3991:4: (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==35) ) {
                int LA88_1 = input.LA(2);

                if ( (LA88_1==54||(LA88_1>=70 && LA88_1<=84)) ) {
                    alt88=1;
                }
            }
            switch (alt88) {
                case 1 :
                    // InternalQVTimperative.g:3991:6: otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}'
                    {
                    otherlv_10=(Token)match(input,35,FollowSets000.FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalQVTimperative.g:3995:1: ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+
                    int cnt87=0;
                    loop87:
                    do {
                        int alt87=2;
                        int LA87_0 = input.LA(1);

                        if ( (LA87_0==54||(LA87_0>=70 && LA87_0<=84)) ) {
                            alt87=1;
                        }


                        switch (alt87) {
                    	case 1 :
                    	    // InternalQVTimperative.g:3995:2: ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )?
                    	    {
                    	    // InternalQVTimperative.g:3995:2: ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) )
                    	    int alt85=16;
                    	    switch ( input.LA(1) ) {
                    	    case 70:
                    	        {
                    	        alt85=1;
                    	        }
                    	        break;
                    	    case 71:
                    	        {
                    	        alt85=2;
                    	        }
                    	        break;
                    	    case 72:
                    	        {
                    	        alt85=3;
                    	        }
                    	        break;
                    	    case 73:
                    	        {
                    	        alt85=4;
                    	        }
                    	        break;
                    	    case 74:
                    	        {
                    	        alt85=5;
                    	        }
                    	        break;
                    	    case 75:
                    	        {
                    	        alt85=6;
                    	        }
                    	        break;
                    	    case 76:
                    	        {
                    	        alt85=7;
                    	        }
                    	        break;
                    	    case 77:
                    	        {
                    	        alt85=8;
                    	        }
                    	        break;
                    	    case 54:
                    	        {
                    	        alt85=9;
                    	        }
                    	        break;
                    	    case 78:
                    	        {
                    	        alt85=10;
                    	        }
                    	        break;
                    	    case 79:
                    	        {
                    	        alt85=11;
                    	        }
                    	        break;
                    	    case 80:
                    	        {
                    	        alt85=12;
                    	        }
                    	        break;
                    	    case 81:
                    	        {
                    	        alt85=13;
                    	        }
                    	        break;
                    	    case 82:
                    	        {
                    	        alt85=14;
                    	        }
                    	        break;
                    	    case 83:
                    	        {
                    	        alt85=15;
                    	        }
                    	        break;
                    	    case 84:
                    	        {
                    	        alt85=16;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 85, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt85) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:3995:3: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:3995:3: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            // InternalQVTimperative.g:3996:1: (lv_qualifiers_11_0= 'derived' )
                    	            {
                    	            // InternalQVTimperative.g:3996:1: (lv_qualifiers_11_0= 'derived' )
                    	            // InternalQVTimperative.g:3997:3: lv_qualifiers_11_0= 'derived'
                    	            {
                    	            lv_qualifiers_11_0=(Token)match(input,70,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_11_0, grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_11_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:4011:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:4011:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            // InternalQVTimperative.g:4012:1: (lv_qualifiers_12_0= '!derived' )
                    	            {
                    	            // InternalQVTimperative.g:4012:1: (lv_qualifiers_12_0= '!derived' )
                    	            // InternalQVTimperative.g:4013:3: lv_qualifiers_12_0= '!derived'
                    	            {
                    	            lv_qualifiers_12_0=(Token)match(input,71,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_12_0, grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_12_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTimperative.g:4027:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            {
                    	            // InternalQVTimperative.g:4027:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            // InternalQVTimperative.g:4028:1: (lv_qualifiers_13_0= 'id' )
                    	            {
                    	            // InternalQVTimperative.g:4028:1: (lv_qualifiers_13_0= 'id' )
                    	            // InternalQVTimperative.g:4029:3: lv_qualifiers_13_0= 'id'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,72,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_13_0, grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_13_0, "id");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTimperative.g:4043:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            {
                    	            // InternalQVTimperative.g:4043:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            // InternalQVTimperative.g:4044:1: (lv_qualifiers_14_0= '!id' )
                    	            {
                    	            // InternalQVTimperative.g:4044:1: (lv_qualifiers_14_0= '!id' )
                    	            // InternalQVTimperative.g:4045:3: lv_qualifiers_14_0= '!id'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,73,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_14_0, grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_14_0, "!id");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTimperative.g:4059:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:4059:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            // InternalQVTimperative.g:4060:1: (lv_qualifiers_15_0= 'ordered' )
                    	            {
                    	            // InternalQVTimperative.g:4060:1: (lv_qualifiers_15_0= 'ordered' )
                    	            // InternalQVTimperative.g:4061:3: lv_qualifiers_15_0= 'ordered'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,74,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_15_0, grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_15_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTimperative.g:4075:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:4075:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            // InternalQVTimperative.g:4076:1: (lv_qualifiers_16_0= '!ordered' )
                    	            {
                    	            // InternalQVTimperative.g:4076:1: (lv_qualifiers_16_0= '!ordered' )
                    	            // InternalQVTimperative.g:4077:3: lv_qualifiers_16_0= '!ordered'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,75,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_16_0, grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_16_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 7 :
                    	            // InternalQVTimperative.g:4091:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            {
                    	            // InternalQVTimperative.g:4091:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            // InternalQVTimperative.g:4092:1: (lv_qualifiers_17_0= 'readonly' )
                    	            {
                    	            // InternalQVTimperative.g:4092:1: (lv_qualifiers_17_0= 'readonly' )
                    	            // InternalQVTimperative.g:4093:3: lv_qualifiers_17_0= 'readonly'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,76,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_17_0, grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_17_0, "readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 8 :
                    	            // InternalQVTimperative.g:4107:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            {
                    	            // InternalQVTimperative.g:4107:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            // InternalQVTimperative.g:4108:1: (lv_qualifiers_18_0= '!readonly' )
                    	            {
                    	            // InternalQVTimperative.g:4108:1: (lv_qualifiers_18_0= '!readonly' )
                    	            // InternalQVTimperative.g:4109:3: lv_qualifiers_18_0= '!readonly'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,77,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_18_0, grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_18_0, "!readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 9 :
                    	            // InternalQVTimperative.g:4123:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            {
                    	            // InternalQVTimperative.g:4123:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            // InternalQVTimperative.g:4124:1: (lv_qualifiers_19_0= 'transient' )
                    	            {
                    	            // InternalQVTimperative.g:4124:1: (lv_qualifiers_19_0= 'transient' )
                    	            // InternalQVTimperative.g:4125:3: lv_qualifiers_19_0= 'transient'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,54,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_19_0, grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 10 :
                    	            // InternalQVTimperative.g:4139:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            {
                    	            // InternalQVTimperative.g:4139:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            // InternalQVTimperative.g:4140:1: (lv_qualifiers_20_0= '!transient' )
                    	            {
                    	            // InternalQVTimperative.g:4140:1: (lv_qualifiers_20_0= '!transient' )
                    	            // InternalQVTimperative.g:4141:3: lv_qualifiers_20_0= '!transient'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,78,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_20_0, grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 11 :
                    	            // InternalQVTimperative.g:4155:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:4155:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            // InternalQVTimperative.g:4156:1: (lv_qualifiers_21_0= 'unique' )
                    	            {
                    	            // InternalQVTimperative.g:4156:1: (lv_qualifiers_21_0= 'unique' )
                    	            // InternalQVTimperative.g:4157:3: lv_qualifiers_21_0= 'unique'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,79,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_21_0, grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 12 :
                    	            // InternalQVTimperative.g:4171:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:4171:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            // InternalQVTimperative.g:4172:1: (lv_qualifiers_22_0= '!unique' )
                    	            {
                    	            // InternalQVTimperative.g:4172:1: (lv_qualifiers_22_0= '!unique' )
                    	            // InternalQVTimperative.g:4173:3: lv_qualifiers_22_0= '!unique'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,80,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_22_0, grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 13 :
                    	            // InternalQVTimperative.g:4187:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            {
                    	            // InternalQVTimperative.g:4187:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            // InternalQVTimperative.g:4188:1: (lv_qualifiers_23_0= 'unsettable' )
                    	            {
                    	            // InternalQVTimperative.g:4188:1: (lv_qualifiers_23_0= 'unsettable' )
                    	            // InternalQVTimperative.g:4189:3: lv_qualifiers_23_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,81,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_23_0, grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 14 :
                    	            // InternalQVTimperative.g:4203:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            {
                    	            // InternalQVTimperative.g:4203:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            // InternalQVTimperative.g:4204:1: (lv_qualifiers_24_0= '!unsettable' )
                    	            {
                    	            // InternalQVTimperative.g:4204:1: (lv_qualifiers_24_0= '!unsettable' )
                    	            // InternalQVTimperative.g:4205:3: lv_qualifiers_24_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,82,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_24_0, grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 15 :
                    	            // InternalQVTimperative.g:4219:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            {
                    	            // InternalQVTimperative.g:4219:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            // InternalQVTimperative.g:4220:1: (lv_qualifiers_25_0= 'volatile' )
                    	            {
                    	            // InternalQVTimperative.g:4220:1: (lv_qualifiers_25_0= 'volatile' )
                    	            // InternalQVTimperative.g:4221:3: lv_qualifiers_25_0= 'volatile'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,83,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_25_0, grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_25_0, "volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 16 :
                    	            // InternalQVTimperative.g:4235:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            {
                    	            // InternalQVTimperative.g:4235:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            // InternalQVTimperative.g:4236:1: (lv_qualifiers_26_0= '!volatile' )
                    	            {
                    	            // InternalQVTimperative.g:4236:1: (lv_qualifiers_26_0= '!volatile' )
                    	            // InternalQVTimperative.g:4237:3: lv_qualifiers_26_0= '!volatile'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,84,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_26_0, grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_26_0, "!volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTimperative.g:4250:3: (otherlv_27= ',' )?
                    	    int alt86=2;
                    	    int LA86_0 = input.LA(1);

                    	    if ( (LA86_0==18) ) {
                    	        alt86=1;
                    	    }
                    	    switch (alt86) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:4250:5: otherlv_27= ','
                    	            {
                    	            otherlv_27=(Token)match(input,18,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_27, grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_28, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:4258:3: ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' )
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==35) ) {
                alt94=1;
            }
            else if ( (LA94_0==21) ) {
                alt94=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 94, 0, input);

                throw nvae;
            }
            switch (alt94) {
                case 1 :
                    // InternalQVTimperative.g:4258:4: (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' )
                    {
                    // InternalQVTimperative.g:4258:4: (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' )
                    // InternalQVTimperative.g:4258:6: otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}'
                    {
                    otherlv_29=(Token)match(input,35,FollowSets000.FOLLOW_77); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_29, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

                    }
                    // InternalQVTimperative.g:4262:1: ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )*
                    loop93:
                    do {
                        int alt93=3;
                        int LA93_0 = input.LA(1);

                        if ( (LA93_0==85) ) {
                            alt93=1;
                        }
                        else if ( (LA93_0==86) ) {
                            alt93=2;
                        }


                        switch (alt93) {
                    	case 1 :
                    	    // InternalQVTimperative.g:4262:2: (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' )
                    	    {
                    	    // InternalQVTimperative.g:4262:2: (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' )
                    	    // InternalQVTimperative.g:4262:4: otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';'
                    	    {
                    	    otherlv_30=(Token)match(input,85,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_30, grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_0_0());

                    	    }
                    	    // InternalQVTimperative.g:4266:1: ( ruleUnrestrictedName )?
                    	    int alt89=2;
                    	    int LA89_0 = input.LA(1);

                    	    if ( ((LA89_0>=RULE_SIMPLE_ID && LA89_0<=RULE_ESCAPED_ID)||LA89_0==17||LA89_0==19||(LA89_0>=22 && LA89_0<=23)||(LA89_0>=25 && LA89_0<=26)||(LA89_0>=29 && LA89_0<=34)||LA89_0==39||(LA89_0>=43 && LA89_0<=48)||(LA89_0>=50 && LA89_0<=52)||(LA89_0>=54 && LA89_0<=55)||(LA89_0>=58 && LA89_0<=60)||(LA89_0>=62 && LA89_0<=70)||LA89_0==72||LA89_0==74||LA89_0==76||LA89_0==79||LA89_0==81||LA89_0==83||(LA89_0>=85 && LA89_0<=89)||(LA89_0>=91 && LA89_0<=96)||LA89_0==98||LA89_0==100||(LA89_0>=102 && LA89_0<=105)) ) {
                    	        alt89=1;
                    	    }
                    	    switch (alt89) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:4267:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_32, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_0_2());

                    	    }
                    	    // InternalQVTimperative.g:4281:1: ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )?
                    	    int alt90=2;
                    	    int LA90_0 = input.LA(1);

                    	    if ( ((LA90_0>=RULE_SINGLE_QUOTED_STRING && LA90_0<=RULE_ESCAPED_ID)||LA90_0==17||LA90_0==19||(LA90_0>=22 && LA90_0<=23)||(LA90_0>=25 && LA90_0<=26)||(LA90_0>=29 && LA90_0<=34)||LA90_0==39||(LA90_0>=42 && LA90_0<=48)||(LA90_0>=50 && LA90_0<=52)||(LA90_0>=54 && LA90_0<=56)||(LA90_0>=58 && LA90_0<=60)||(LA90_0>=62 && LA90_0<=70)||LA90_0==72||LA90_0==74||LA90_0==76||LA90_0==79||LA90_0==81||LA90_0==83||(LA90_0>=85 && LA90_0<=89)||(LA90_0>=91 && LA90_0<=96)||LA90_0==98||LA90_0==100||(LA90_0>=102 && LA90_0<=108)||(LA90_0>=127 && LA90_0<=141)||LA90_0==143||(LA90_0>=145 && LA90_0<=148)||LA90_0==154||(LA90_0>=159 && LA90_0<=160)) ) {
                    	        alt90=1;
                    	    }
                    	    switch (alt90) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:4282:1: (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTimperative.g:4282:1: (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS )
                    	            // InternalQVTimperative.g:4283:3: lv_ownedDefaultExpressions_33_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_0_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_9);
                    	            lv_ownedDefaultExpressions_33_0=ruleSpecificationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedDefaultExpressions",
                    	                      		lv_ownedDefaultExpressions_33_0,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_34, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_0_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTimperative.g:4304:6: (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' )
                    	    {
                    	    // InternalQVTimperative.g:4304:6: (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' )
                    	    // InternalQVTimperative.g:4304:8: otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';'
                    	    {
                    	    otherlv_35=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_35, grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_1_0());

                    	    }
                    	    // InternalQVTimperative.g:4308:1: ( ruleUnrestrictedName )?
                    	    int alt91=2;
                    	    int LA91_0 = input.LA(1);

                    	    if ( ((LA91_0>=RULE_SIMPLE_ID && LA91_0<=RULE_ESCAPED_ID)||LA91_0==17||LA91_0==19||(LA91_0>=22 && LA91_0<=23)||(LA91_0>=25 && LA91_0<=26)||(LA91_0>=29 && LA91_0<=34)||LA91_0==39||(LA91_0>=43 && LA91_0<=48)||(LA91_0>=50 && LA91_0<=52)||(LA91_0>=54 && LA91_0<=55)||(LA91_0>=58 && LA91_0<=60)||(LA91_0>=62 && LA91_0<=70)||LA91_0==72||LA91_0==74||LA91_0==76||LA91_0==79||LA91_0==81||LA91_0==83||(LA91_0>=85 && LA91_0<=89)||(LA91_0>=91 && LA91_0<=96)||LA91_0==98||LA91_0==100||(LA91_0>=102 && LA91_0<=105)) ) {
                    	        alt91=1;
                    	    }
                    	    switch (alt91) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:4309:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_37, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());

                    	    }
                    	    // InternalQVTimperative.g:4323:1: ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )?
                    	    int alt92=2;
                    	    int LA92_0 = input.LA(1);

                    	    if ( ((LA92_0>=RULE_SINGLE_QUOTED_STRING && LA92_0<=RULE_ESCAPED_ID)||LA92_0==17||LA92_0==19||(LA92_0>=22 && LA92_0<=23)||(LA92_0>=25 && LA92_0<=26)||(LA92_0>=29 && LA92_0<=34)||LA92_0==39||(LA92_0>=42 && LA92_0<=48)||(LA92_0>=50 && LA92_0<=52)||(LA92_0>=54 && LA92_0<=56)||(LA92_0>=58 && LA92_0<=60)||(LA92_0>=62 && LA92_0<=70)||LA92_0==72||LA92_0==74||LA92_0==76||LA92_0==79||LA92_0==81||LA92_0==83||(LA92_0>=85 && LA92_0<=89)||(LA92_0>=91 && LA92_0<=96)||LA92_0==98||LA92_0==100||(LA92_0>=102 && LA92_0<=108)||(LA92_0>=127 && LA92_0<=141)||LA92_0==143||(LA92_0>=145 && LA92_0<=148)||LA92_0==154||(LA92_0>=159 && LA92_0<=160)) ) {
                    	        alt92=1;
                    	    }
                    	    switch (alt92) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:4324:1: (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTimperative.g:4324:1: (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS )
                    	            // InternalQVTimperative.g:4325:3: lv_ownedDefaultExpressions_38_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_9);
                    	            lv_ownedDefaultExpressions_38_0=ruleSpecificationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedDefaultExpressions",
                    	                      		lv_ownedDefaultExpressions_38_0,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_39, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());

                    	    }

                    	    }


                    	    }
                    	    break;

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

                    otherlv_40=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_40, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4350:7: otherlv_41= ';'
                    {
                    otherlv_41=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_41, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleClassCS"
    // InternalQVTimperative.g:4362:1: entryRuleClassCS returns [EObject current=null] : iv_ruleClassCS= ruleClassCS EOF ;
    public final EObject entryRuleClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClassCS = null;


        try {
            // InternalQVTimperative.g:4363:2: (iv_ruleClassCS= ruleClassCS EOF )
            // InternalQVTimperative.g:4364:2: iv_ruleClassCS= ruleClassCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleClassCS=ruleClassCS();

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

            }

        }

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


    // $ANTLR start "ruleClassCS"
    // InternalQVTimperative.g:4371:1: ruleClassCS returns [EObject current=null] : (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS ) ;
    public final EObject ruleClassCS() throws RecognitionException {
        EObject current = null;

        EObject this_StructuredClassCS_0 = null;

        EObject this_DataTypeCS_1 = null;

        EObject this_EnumerationCS_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4374:28: ( (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS ) )
            // InternalQVTimperative.g:4375:1: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            {
            // InternalQVTimperative.g:4375:1: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            int alt95=3;
            switch ( input.LA(1) ) {
            case 102:
            case 103:
                {
                alt95=1;
                }
                break;
            case 87:
            case 88:
                {
                alt95=2;
                }
                break;
            case 91:
                {
                alt95=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 95, 0, input);

                throw nvae;
            }

            switch (alt95) {
                case 1 :
                    // InternalQVTimperative.g:4376:2: this_StructuredClassCS_0= ruleStructuredClassCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getClassCSAccess().getStructuredClassCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StructuredClassCS_0=ruleStructuredClassCS();

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

                              current = this_StructuredClassCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4389:2: this_DataTypeCS_1= ruleDataTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getClassCSAccess().getDataTypeCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DataTypeCS_1=ruleDataTypeCS();

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

                              current = this_DataTypeCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:4402:2: this_EnumerationCS_2= ruleEnumerationCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getClassCSAccess().getEnumerationCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnumerationCS_2=ruleEnumerationCS();

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

                              current = this_EnumerationCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCompoundTargetElementCS"
    // InternalQVTimperative.g:4421:1: entryRuleCompoundTargetElementCS returns [EObject current=null] : iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF ;
    public final EObject entryRuleCompoundTargetElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCompoundTargetElementCS = null;


        try {
            // InternalQVTimperative.g:4422:2: (iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF )
            // InternalQVTimperative.g:4423:2: iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCompoundTargetElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCompoundTargetElementCS=ruleCompoundTargetElementCS();

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

            }

        }

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


    // $ANTLR start "ruleCompoundTargetElementCS"
    // InternalQVTimperative.g:4430:1: ruleCompoundTargetElementCS returns [EObject current=null] : (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? ) ;
    public final EObject ruleCompoundTargetElementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        EObject lv_ownedTargetElements_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4433:28: ( (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? ) )
            // InternalQVTimperative.g:4434:1: (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? )
            {
            // InternalQVTimperative.g:4434:1: (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? )
            // InternalQVTimperative.g:4434:3: otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )?
            {
            otherlv_0=(Token)match(input,35,FollowSets000.FOLLOW_79); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getCompoundTargetElementCSAccess().getLeftCurlyBracketKeyword_0());

            }
            // InternalQVTimperative.g:4438:1: ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )*
            loop96:
            do {
                int alt96=2;
                int LA96_0 = input.LA(1);

                if ( ((LA96_0>=33 && LA96_0<=34)||LA96_0==66) ) {
                    alt96=1;
                }


                switch (alt96) {
            	case 1 :
            	    // InternalQVTimperative.g:4439:1: (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS )
            	    {
            	    // InternalQVTimperative.g:4439:1: (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS )
            	    // InternalQVTimperative.g:4440:3: lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getCompoundTargetElementCSAccess().getOwnedTargetElementsSimpleTargetElementCSParserRuleCall_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_79);
            	    lv_ownedTargetElements_1_0=ruleSimpleTargetElementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getCompoundTargetElementCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedTargetElements",
            	              		lv_ownedTargetElements_1_0,
            	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SimpleTargetElementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            otherlv_2=(Token)match(input,36,FollowSets000.FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getCompoundTargetElementCSAccess().getRightCurlyBracketKeyword_2());

            }
            // InternalQVTimperative.g:4460:1: (otherlv_3= ';' )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==21) ) {
                alt97=1;
            }
            switch (alt97) {
                case 1 :
                    // InternalQVTimperative.g:4460:3: otherlv_3= ';'
                    {
                    otherlv_3=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getCompoundTargetElementCSAccess().getSemicolonKeyword_3());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleDataTypeCS"
    // InternalQVTimperative.g:4472:1: entryRuleDataTypeCS returns [EObject current=null] : iv_ruleDataTypeCS= ruleDataTypeCS EOF ;
    public final EObject entryRuleDataTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataTypeCS = null;


        try {
            // InternalQVTimperative.g:4473:2: (iv_ruleDataTypeCS= ruleDataTypeCS EOF )
            // InternalQVTimperative.g:4474:2: iv_ruleDataTypeCS= ruleDataTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDataTypeCS=ruleDataTypeCS();

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

            }

        }

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


    // $ANTLR start "ruleDataTypeCS"
    // InternalQVTimperative.g:4481:1: ruleDataTypeCS returns [EObject current=null] : ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
    public final EObject ruleDataTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_isPrimitive_0_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token lv_instanceClassName_5_0=null;
        Token otherlv_6=null;
        Token lv_isSerializable_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedSignature_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4484:28: ( ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) ) )
            // InternalQVTimperative.g:4485:1: ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) )
            {
            // InternalQVTimperative.g:4485:1: ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) )
            // InternalQVTimperative.g:4485:2: ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' )
            {
            // InternalQVTimperative.g:4485:2: ( (lv_isPrimitive_0_0= 'primitive' ) )?
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==87) ) {
                alt98=1;
            }
            switch (alt98) {
                case 1 :
                    // InternalQVTimperative.g:4486:1: (lv_isPrimitive_0_0= 'primitive' )
                    {
                    // InternalQVTimperative.g:4486:1: (lv_isPrimitive_0_0= 'primitive' )
                    // InternalQVTimperative.g:4487:3: lv_isPrimitive_0_0= 'primitive'
                    {
                    lv_isPrimitive_0_0=(Token)match(input,87,FollowSets000.FOLLOW_81); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isPrimitive_0_0, grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getDataTypeCSRule());
                      	        }
                             		setWithLastConsumed(current, "isPrimitive", true, "primitive");

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());

            }
            // InternalQVTimperative.g:4504:1: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:4505:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:4505:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:4506:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_82);
            lv_name_2_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_2_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:4522:2: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==56) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // InternalQVTimperative.g:4523:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTimperative.g:4523:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalQVTimperative.g:4524:3: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_83);
                    lv_ownedSignature_3_0=ruleTemplateSignatureCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSignature",
                              		lv_ownedSignature_3_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4540:3: (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==24) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalQVTimperative.g:4540:5: otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTimperative.g:4544:1: ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:4545:1: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:4545:1: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:4546:3: lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_5_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_instanceClassName_5_0, grammarAccess.getDataTypeCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getDataTypeCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"instanceClassName",
                              		lv_instanceClassName_5_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4562:4: (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )?
            int alt102=2;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==35) ) {
                int LA102_1 = input.LA(2);

                if ( ((LA102_1>=89 && LA102_1<=90)) ) {
                    alt102=1;
                }
                else if ( (LA102_1==36) ) {
                    int LA102_4 = input.LA(3);

                    if ( (LA102_4==21||LA102_4==35) ) {
                        alt102=1;
                    }
                }
            }
            switch (alt102) {
                case 1 :
                    // InternalQVTimperative.g:4562:6: otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}'
                    {
                    otherlv_6=(Token)match(input,35,FollowSets000.FOLLOW_84); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalQVTimperative.g:4566:1: ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )?
                    int alt101=3;
                    int LA101_0 = input.LA(1);

                    if ( (LA101_0==89) ) {
                        alt101=1;
                    }
                    else if ( (LA101_0==90) ) {
                        alt101=2;
                    }
                    switch (alt101) {
                        case 1 :
                            // InternalQVTimperative.g:4566:2: ( (lv_isSerializable_7_0= 'serializable' ) )
                            {
                            // InternalQVTimperative.g:4566:2: ( (lv_isSerializable_7_0= 'serializable' ) )
                            // InternalQVTimperative.g:4567:1: (lv_isSerializable_7_0= 'serializable' )
                            {
                            // InternalQVTimperative.g:4567:1: (lv_isSerializable_7_0= 'serializable' )
                            // InternalQVTimperative.g:4568:3: lv_isSerializable_7_0= 'serializable'
                            {
                            lv_isSerializable_7_0=(Token)match(input,89,FollowSets000.FOLLOW_58); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_isSerializable_7_0, grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getDataTypeCSRule());
                              	        }
                                     		setWithLastConsumed(current, "isSerializable", true, "serializable");

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTimperative.g:4582:7: otherlv_8= '!serializable'
                            {
                            otherlv_8=(Token)match(input,90,FollowSets000.FOLLOW_58); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_8, grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());

                            }

                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_9, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:4590:3: ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' )
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==35) ) {
                alt103=1;
            }
            else if ( (LA103_0==21) ) {
                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 :
                    // InternalQVTimperative.g:4590:4: (otherlv_10= '{' otherlv_11= '}' )
                    {
                    // InternalQVTimperative.g:4590:4: (otherlv_10= '{' otherlv_11= '}' )
                    // InternalQVTimperative.g:4590:6: otherlv_10= '{' otherlv_11= '}'
                    {
                    otherlv_10=(Token)match(input,35,FollowSets000.FOLLOW_58); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

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

                          	newLeafNode(otherlv_11, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_1());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4599:7: otherlv_12= ';'
                    {
                    otherlv_12=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getDataTypeCSAccess().getSemicolonKeyword_6_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEnumerationCS"
    // InternalQVTimperative.g:4611:1: entryRuleEnumerationCS returns [EObject current=null] : iv_ruleEnumerationCS= ruleEnumerationCS EOF ;
    public final EObject entryRuleEnumerationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationCS = null;


        try {
            // InternalQVTimperative.g:4612:2: (iv_ruleEnumerationCS= ruleEnumerationCS EOF )
            // InternalQVTimperative.g:4613:2: iv_ruleEnumerationCS= ruleEnumerationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationCS=ruleEnumerationCS();

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

            }

        }

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


    // $ANTLR start "ruleEnumerationCS"
    // InternalQVTimperative.g:4620:1: ruleEnumerationCS returns [EObject current=null] : (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
    public final EObject ruleEnumerationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token lv_instanceClassName_4_0=null;
        Token otherlv_5=null;
        Token lv_isSerializable_6_0=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedSignature_2_0 = null;

        EObject lv_ownedLiterals_10_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4623:28: ( (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
            // InternalQVTimperative.g:4624:1: (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
            {
            // InternalQVTimperative.g:4624:1: (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
            // InternalQVTimperative.g:4624:3: otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' )
            {
            otherlv_0=(Token)match(input,91,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());

            }
            // InternalQVTimperative.g:4628:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:4629:1: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:4629:1: (lv_name_1_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:4630:3: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_82);
            lv_name_1_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_1_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:4646:2: ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==56) ) {
                alt104=1;
            }
            switch (alt104) {
                case 1 :
                    // InternalQVTimperative.g:4647:1: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTimperative.g:4647:1: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    // InternalQVTimperative.g:4648:3: lv_ownedSignature_2_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_83);
                    lv_ownedSignature_2_0=ruleTemplateSignatureCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSignature",
                              		lv_ownedSignature_2_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4664:3: (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==24) ) {
                alt105=1;
            }
            switch (alt105) {
                case 1 :
                    // InternalQVTimperative.g:4664:5: otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_3=(Token)match(input,24,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTimperative.g:4668:1: ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:4669:1: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:4669:1: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:4670:3: lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_4_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_instanceClassName_4_0, grammarAccess.getEnumerationCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_3_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getEnumerationCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"instanceClassName",
                              		lv_instanceClassName_4_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4686:4: (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )?
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==35) ) {
                int LA107_1 = input.LA(2);

                if ( ((LA107_1>=89 && LA107_1<=90)) ) {
                    alt107=1;
                }
                else if ( (LA107_1==36) ) {
                    int LA107_4 = input.LA(3);

                    if ( (LA107_4==21||LA107_4==35) ) {
                        alt107=1;
                    }
                }
            }
            switch (alt107) {
                case 1 :
                    // InternalQVTimperative.g:4686:6: otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}'
                    {
                    otherlv_5=(Token)match(input,35,FollowSets000.FOLLOW_84); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());

                    }
                    // InternalQVTimperative.g:4690:1: ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )?
                    int alt106=3;
                    int LA106_0 = input.LA(1);

                    if ( (LA106_0==89) ) {
                        alt106=1;
                    }
                    else if ( (LA106_0==90) ) {
                        alt106=2;
                    }
                    switch (alt106) {
                        case 1 :
                            // InternalQVTimperative.g:4690:2: ( (lv_isSerializable_6_0= 'serializable' ) )
                            {
                            // InternalQVTimperative.g:4690:2: ( (lv_isSerializable_6_0= 'serializable' ) )
                            // InternalQVTimperative.g:4691:1: (lv_isSerializable_6_0= 'serializable' )
                            {
                            // InternalQVTimperative.g:4691:1: (lv_isSerializable_6_0= 'serializable' )
                            // InternalQVTimperative.g:4692:3: lv_isSerializable_6_0= 'serializable'
                            {
                            lv_isSerializable_6_0=(Token)match(input,89,FollowSets000.FOLLOW_58); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_isSerializable_6_0, grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getEnumerationCSRule());
                              	        }
                                     		setWithLastConsumed(current, "isSerializable", true, "serializable");

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTimperative.g:4706:7: otherlv_7= '!serializable'
                            {
                            otherlv_7=(Token)match(input,90,FollowSets000.FOLLOW_58); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_7, grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());

                            }

                            }
                            break;

                    }

                    otherlv_8=(Token)match(input,36,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:4714:3: ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' )
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==35) ) {
                alt109=1;
            }
            else if ( (LA109_0==21) ) {
                alt109=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 109, 0, input);

                throw nvae;
            }
            switch (alt109) {
                case 1 :
                    // InternalQVTimperative.g:4714:4: (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' )
                    {
                    // InternalQVTimperative.g:4714:4: (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' )
                    // InternalQVTimperative.g:4714:6: otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}'
                    {
                    otherlv_9=(Token)match(input,35,FollowSets000.FOLLOW_85); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());

                    }
                    // InternalQVTimperative.g:4718:1: ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )*
                    loop108:
                    do {
                        int alt108=2;
                        int LA108_0 = input.LA(1);

                        if ( ((LA108_0>=RULE_SIMPLE_ID && LA108_0<=RULE_ESCAPED_ID)||LA108_0==92) ) {
                            alt108=1;
                        }


                        switch (alt108) {
                    	case 1 :
                    	    // InternalQVTimperative.g:4719:1: (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS )
                    	    {
                    	    // InternalQVTimperative.g:4719:1: (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS )
                    	    // InternalQVTimperative.g:4720:3: lv_ownedLiterals_10_0= ruleEnumerationLiteralCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_85);
                    	    lv_ownedLiterals_10_0=ruleEnumerationLiteralCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedLiterals",
                    	              		lv_ownedLiterals_10_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.EnumerationLiteralCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_11, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4741:7: otherlv_12= ';'
                    {
                    otherlv_12=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getEnumerationCSAccess().getSemicolonKeyword_5_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEnumerationLiteralCS"
    // InternalQVTimperative.g:4753:1: entryRuleEnumerationLiteralCS returns [EObject current=null] : iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF ;
    public final EObject entryRuleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationLiteralCS = null;


        try {
            // InternalQVTimperative.g:4754:2: (iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF )
            // InternalQVTimperative.g:4755:2: iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationLiteralCS=ruleEnumerationLiteralCS();

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

            }

        }

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


    // $ANTLR start "ruleEnumerationLiteralCS"
    // InternalQVTimperative.g:4762:1: ruleEnumerationLiteralCS returns [EObject current=null] : ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) ) ;
    public final EObject ruleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_value_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4765:28: ( ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) ) )
            // InternalQVTimperative.g:4766:1: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) )
            {
            // InternalQVTimperative.g:4766:1: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) )
            // InternalQVTimperative.g:4766:2: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' )
            {
            // InternalQVTimperative.g:4766:2: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) )
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==92) ) {
                alt110=1;
            }
            else if ( ((LA110_0>=RULE_SIMPLE_ID && LA110_0<=RULE_ESCAPED_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 :
                    // InternalQVTimperative.g:4766:3: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    {
                    // InternalQVTimperative.g:4766:3: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    // InternalQVTimperative.g:4766:5: otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) )
                    {
                    otherlv_0=(Token)match(input,92,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());

                    }
                    // InternalQVTimperative.g:4770:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:4771:1: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:4771:1: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalQVTimperative.g:4772:3: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_50);
                    lv_name_1_0=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4789:6: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    {
                    // InternalQVTimperative.g:4789:6: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    // InternalQVTimperative.g:4790:1: (lv_name_2_0= ruleEnumerationLiteralName )
                    {
                    // InternalQVTimperative.g:4790:1: (lv_name_2_0= ruleEnumerationLiteralName )
                    // InternalQVTimperative.g:4791:3: lv_name_2_0= ruleEnumerationLiteralName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_50);
                    lv_name_2_0=ruleEnumerationLiteralName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_2_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.EnumerationLiteralName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4807:3: (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==53) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // InternalQVTimperative.g:4807:5: otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) )
                    {
                    otherlv_3=(Token)match(input,53,FollowSets000.FOLLOW_86); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_1_0());

                    }
                    // InternalQVTimperative.g:4811:1: ( (lv_value_4_0= ruleSIGNED ) )
                    // InternalQVTimperative.g:4812:1: (lv_value_4_0= ruleSIGNED )
                    {
                    // InternalQVTimperative.g:4812:1: (lv_value_4_0= ruleSIGNED )
                    // InternalQVTimperative.g:4813:3: lv_value_4_0= ruleSIGNED
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_51);
                    lv_value_4_0=ruleSIGNED();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      	        }
                             		set(
                             			current,
                             			"value",
                              		lv_value_4_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SIGNED");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4829:4: ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' )
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==35) ) {
                alt112=1;
            }
            else if ( (LA112_0==21) ) {
                alt112=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 112, 0, input);

                throw nvae;
            }
            switch (alt112) {
                case 1 :
                    // InternalQVTimperative.g:4829:5: (otherlv_5= '{' otherlv_6= '}' )
                    {
                    // InternalQVTimperative.g:4829:5: (otherlv_5= '{' otherlv_6= '}' )
                    // InternalQVTimperative.g:4829:7: otherlv_5= '{' otherlv_6= '}'
                    {
                    otherlv_5=(Token)match(input,35,FollowSets000.FOLLOW_58); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_2_0_0());

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

                          	newLeafNode(otherlv_6, grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_2_0_1());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4838:7: otherlv_7= ';'
                    {
                    otherlv_7=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_2_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleOperationCS"
    // InternalQVTimperative.g:4850:1: entryRuleOperationCS returns [EObject current=null] : iv_ruleOperationCS= ruleOperationCS EOF ;
    public final EObject entryRuleOperationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOperationCS = null;


        try {
            // InternalQVTimperative.g:4851:2: (iv_ruleOperationCS= ruleOperationCS EOF )
            // InternalQVTimperative.g:4852:2: iv_ruleOperationCS= ruleOperationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOperationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleOperationCS=ruleOperationCS();

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

            }

        }

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


    // $ANTLR start "ruleOperationCS"
    // InternalQVTimperative.g:4859:1: ruleOperationCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) ) ;
    public final EObject ruleOperationCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token otherlv_25=null;
        Token otherlv_26=null;
        Token otherlv_27=null;
        Token otherlv_28=null;
        Token otherlv_30=null;
        Token otherlv_32=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        EObject lv_ownedSignature_5_0 = null;

        AntlrDatatypeRuleToken lv_name_6_0 = null;

        EObject lv_ownedParameters_8_0 = null;

        EObject lv_ownedParameters_10_0 = null;

        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedExceptions_15_0 = null;

        EObject lv_ownedExceptions_17_0 = null;

        EObject lv_ownedBodyExpressions_31_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:4862:28: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) ) )
            // InternalQVTimperative.g:4863:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) )
            {
            // InternalQVTimperative.g:4863:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) )
            // InternalQVTimperative.g:4863:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' )
            {
            // InternalQVTimperative.g:4863:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt115=3;
            int LA115_0 = input.LA(1);

            if ( (LA115_0==67) ) {
                alt115=1;
            }
            else if ( (LA115_0==68) ) {
                alt115=2;
            }
            switch (alt115) {
                case 1 :
                    // InternalQVTimperative.g:4863:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTimperative.g:4863:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTimperative.g:4863:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTimperative.g:4863:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTimperative.g:4864:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTimperative.g:4864:1: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTimperative.g:4865:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,67,FollowSets000.FOLLOW_87); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_0_0, grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getOperationCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTimperative.g:4878:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt113=2;
                    int LA113_0 = input.LA(1);

                    if ( (LA113_0==68) ) {
                        alt113=1;
                    }
                    switch (alt113) {
                        case 1 :
                            // InternalQVTimperative.g:4879:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTimperative.g:4879:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTimperative.g:4880:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,68,FollowSets000.FOLLOW_88); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_1_0, grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getOperationCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:4894:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTimperative.g:4894:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTimperative.g:4894:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTimperative.g:4894:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTimperative.g:4895:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTimperative.g:4895:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTimperative.g:4896:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,68,FollowSets000.FOLLOW_89); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_2_0, grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getOperationCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTimperative.g:4909:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt114=2;
                    int LA114_0 = input.LA(1);

                    if ( (LA114_0==67) ) {
                        alt114=1;
                    }
                    switch (alt114) {
                        case 1 :
                            // InternalQVTimperative.g:4910:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTimperative.g:4910:1: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTimperative.g:4911:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,67,FollowSets000.FOLLOW_88); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_3_0, grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getOperationCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,93,FollowSets000.FOLLOW_90); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getOperationCSAccess().getOperationKeyword_1());

            }
            // InternalQVTimperative.g:4928:1: ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )?
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==56) ) {
                alt116=1;
            }
            switch (alt116) {
                case 1 :
                    // InternalQVTimperative.g:4929:1: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTimperative.g:4929:1: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    // InternalQVTimperative.g:4930:3: lv_ownedSignature_5_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_ownedSignature_5_0=ruleTemplateSignatureCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSignature",
                              		lv_ownedSignature_5_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:4946:3: ( (lv_name_6_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:4947:1: (lv_name_6_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:4947:1: (lv_name_6_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:4948:3: lv_name_6_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getOperationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_name_6_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_6_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());

            }
            // InternalQVTimperative.g:4968:1: ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )?
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( ((LA118_0>=RULE_SIMPLE_ID && LA118_0<=RULE_ESCAPED_ID)||LA118_0==17||LA118_0==19||(LA118_0>=22 && LA118_0<=23)||(LA118_0>=25 && LA118_0<=26)||(LA118_0>=29 && LA118_0<=34)||LA118_0==39||(LA118_0>=43 && LA118_0<=48)||(LA118_0>=50 && LA118_0<=52)||(LA118_0>=54 && LA118_0<=55)||(LA118_0>=58 && LA118_0<=60)||(LA118_0>=62 && LA118_0<=70)||LA118_0==72||LA118_0==74||LA118_0==76||LA118_0==79||LA118_0==81||LA118_0==83||(LA118_0>=85 && LA118_0<=89)||(LA118_0>=91 && LA118_0<=96)||LA118_0==98||LA118_0==100||(LA118_0>=102 && LA118_0<=105)) ) {
                alt118=1;
            }
            switch (alt118) {
                case 1 :
                    // InternalQVTimperative.g:4968:2: ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    {
                    // InternalQVTimperative.g:4968:2: ( (lv_ownedParameters_8_0= ruleParameterCS ) )
                    // InternalQVTimperative.g:4969:1: (lv_ownedParameters_8_0= ruleParameterCS )
                    {
                    // InternalQVTimperative.g:4969:1: (lv_ownedParameters_8_0= ruleParameterCS )
                    // InternalQVTimperative.g:4970:3: lv_ownedParameters_8_0= ruleParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_56);
                    lv_ownedParameters_8_0=ruleParameterCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParameters",
                              		lv_ownedParameters_8_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ParameterCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:4986:2: (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    loop117:
                    do {
                        int alt117=2;
                        int LA117_0 = input.LA(1);

                        if ( (LA117_0==18) ) {
                            alt117=1;
                        }


                        switch (alt117) {
                    	case 1 :
                    	    // InternalQVTimperative.g:4986:4: otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    {
                    	    otherlv_9=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());

                    	    }
                    	    // InternalQVTimperative.g:4990:1: ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    // InternalQVTimperative.g:4991:1: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    {
                    	    // InternalQVTimperative.g:4991:1: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    // InternalQVTimperative.g:4992:3: lv_ownedParameters_10_0= ruleParameterCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_56);
                    	    lv_ownedParameters_10_0=ruleParameterCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParameters",
                    	              		lv_ownedParameters_10_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ParameterCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_11, grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());

            }
            // InternalQVTimperative.g:5012:1: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==24) ) {
                alt119=1;
            }
            switch (alt119) {
                case 1 :
                    // InternalQVTimperative.g:5012:3: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_12=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getOperationCSAccess().getColonKeyword_7_0());

                    }
                    // InternalQVTimperative.g:5016:1: ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTimperative.g:5017:1: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTimperative.g:5017:1: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTimperative.g:5018:3: lv_ownedType_13_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_92);
                    lv_ownedType_13_0=ruleTypedMultiplicityRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_13_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:5034:4: (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==94) ) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // InternalQVTimperative.g:5034:6: otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_14=(Token)match(input,94,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_14, grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());

                    }
                    // InternalQVTimperative.g:5038:1: ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) )
                    // InternalQVTimperative.g:5039:1: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    {
                    // InternalQVTimperative.g:5039:1: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    // InternalQVTimperative.g:5040:3: lv_ownedExceptions_15_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_93);
                    lv_ownedExceptions_15_0=ruleTypedRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedExceptions",
                              		lv_ownedExceptions_15_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:5056:2: (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    loop120:
                    do {
                        int alt120=2;
                        int LA120_0 = input.LA(1);

                        if ( (LA120_0==18) ) {
                            alt120=1;
                        }


                        switch (alt120) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5056:4: otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_16=(Token)match(input,18,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_16, grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());

                    	    }
                    	    // InternalQVTimperative.g:5060:1: ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    // InternalQVTimperative.g:5061:1: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTimperative.g:5061:1: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    // InternalQVTimperative.g:5062:3: lv_ownedExceptions_17_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_93);
                    	    lv_ownedExceptions_17_0=ruleTypedRefCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedExceptions",
                    	              		lv_ownedExceptions_17_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:5078:6: (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )?
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==35) ) {
                int LA125_1 = input.LA(2);

                if ( ((LA125_1>=70 && LA125_1<=71)||(LA125_1>=74 && LA125_1<=75)||(LA125_1>=79 && LA125_1<=80)) ) {
                    alt125=1;
                }
            }
            switch (alt125) {
                case 1 :
                    // InternalQVTimperative.g:5078:8: otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}'
                    {
                    otherlv_18=(Token)match(input,35,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_18, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());

                    }
                    // InternalQVTimperative.g:5082:1: ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+
                    int cnt124=0;
                    loop124:
                    do {
                        int alt124=2;
                        int LA124_0 = input.LA(1);

                        if ( ((LA124_0>=70 && LA124_0<=71)||(LA124_0>=74 && LA124_0<=75)||(LA124_0>=79 && LA124_0<=80)) ) {
                            alt124=1;
                        }


                        switch (alt124) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5082:2: ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )?
                    	    {
                    	    // InternalQVTimperative.g:5082:2: ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) )
                    	    int alt122=6;
                    	    switch ( input.LA(1) ) {
                    	    case 70:
                    	        {
                    	        alt122=1;
                    	        }
                    	        break;
                    	    case 71:
                    	        {
                    	        alt122=2;
                    	        }
                    	        break;
                    	    case 74:
                    	        {
                    	        alt122=3;
                    	        }
                    	        break;
                    	    case 75:
                    	        {
                    	        alt122=4;
                    	        }
                    	        break;
                    	    case 79:
                    	        {
                    	        alt122=5;
                    	        }
                    	        break;
                    	    case 80:
                    	        {
                    	        alt122=6;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 122, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt122) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5082:3: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:5082:3: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            // InternalQVTimperative.g:5083:1: (lv_qualifiers_19_0= 'derived' )
                    	            {
                    	            // InternalQVTimperative.g:5083:1: (lv_qualifiers_19_0= 'derived' )
                    	            // InternalQVTimperative.g:5084:3: lv_qualifiers_19_0= 'derived'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,70,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_19_0, grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:5098:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:5098:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            // InternalQVTimperative.g:5099:1: (lv_qualifiers_20_0= '!derived' )
                    	            {
                    	            // InternalQVTimperative.g:5099:1: (lv_qualifiers_20_0= '!derived' )
                    	            // InternalQVTimperative.g:5100:3: lv_qualifiers_20_0= '!derived'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,71,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_20_0, grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTimperative.g:5114:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5114:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            // InternalQVTimperative.g:5115:1: (lv_qualifiers_21_0= 'ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5115:1: (lv_qualifiers_21_0= 'ordered' )
                    	            // InternalQVTimperative.g:5116:3: lv_qualifiers_21_0= 'ordered'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,74,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_21_0, grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTimperative.g:5130:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5130:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            // InternalQVTimperative.g:5131:1: (lv_qualifiers_22_0= '!ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5131:1: (lv_qualifiers_22_0= '!ordered' )
                    	            // InternalQVTimperative.g:5132:3: lv_qualifiers_22_0= '!ordered'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,75,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_22_0, grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTimperative.g:5146:6: ( (lv_qualifiers_23_0= 'unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5146:6: ( (lv_qualifiers_23_0= 'unique' ) )
                    	            // InternalQVTimperative.g:5147:1: (lv_qualifiers_23_0= 'unique' )
                    	            {
                    	            // InternalQVTimperative.g:5147:1: (lv_qualifiers_23_0= 'unique' )
                    	            // InternalQVTimperative.g:5148:3: lv_qualifiers_23_0= 'unique'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,79,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_23_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTimperative.g:5162:6: ( (lv_qualifiers_24_0= '!unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5162:6: ( (lv_qualifiers_24_0= '!unique' ) )
                    	            // InternalQVTimperative.g:5163:1: (lv_qualifiers_24_0= '!unique' )
                    	            {
                    	            // InternalQVTimperative.g:5163:1: (lv_qualifiers_24_0= '!unique' )
                    	            // InternalQVTimperative.g:5164:3: lv_qualifiers_24_0= '!unique'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,80,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_24_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTimperative.g:5177:3: (otherlv_25= ',' )?
                    	    int alt123=2;
                    	    int LA123_0 = input.LA(1);

                    	    if ( (LA123_0==18) ) {
                    	        alt123=1;
                    	    }
                    	    switch (alt123) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5177:5: otherlv_25= ','
                    	            {
                    	            otherlv_25=(Token)match(input,18,FollowSets000.FOLLOW_96); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_25, grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

                    otherlv_26=(Token)match(input,36,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_26, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:5185:3: ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' )
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==35) ) {
                alt129=1;
            }
            else if ( (LA129_0==21) ) {
                alt129=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 129, 0, input);

                throw nvae;
            }
            switch (alt129) {
                case 1 :
                    // InternalQVTimperative.g:5185:4: (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' )
                    {
                    // InternalQVTimperative.g:5185:4: (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' )
                    // InternalQVTimperative.g:5185:6: otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}'
                    {
                    otherlv_27=(Token)match(input,35,FollowSets000.FOLLOW_97); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_27, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());

                    }
                    // InternalQVTimperative.g:5189:1: (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )*
                    loop128:
                    do {
                        int alt128=2;
                        int LA128_0 = input.LA(1);

                        if ( (LA128_0==95) ) {
                            alt128=1;
                        }


                        switch (alt128) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5189:3: otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';'
                    	    {
                    	    otherlv_28=(Token)match(input,95,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_28, grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_0());

                    	    }
                    	    // InternalQVTimperative.g:5193:1: ( ruleUnrestrictedName )?
                    	    int alt126=2;
                    	    int LA126_0 = input.LA(1);

                    	    if ( ((LA126_0>=RULE_SIMPLE_ID && LA126_0<=RULE_ESCAPED_ID)||LA126_0==17||LA126_0==19||(LA126_0>=22 && LA126_0<=23)||(LA126_0>=25 && LA126_0<=26)||(LA126_0>=29 && LA126_0<=34)||LA126_0==39||(LA126_0>=43 && LA126_0<=48)||(LA126_0>=50 && LA126_0<=52)||(LA126_0>=54 && LA126_0<=55)||(LA126_0>=58 && LA126_0<=60)||(LA126_0>=62 && LA126_0<=70)||LA126_0==72||LA126_0==74||LA126_0==76||LA126_0==79||LA126_0==81||LA126_0==83||(LA126_0>=85 && LA126_0<=89)||(LA126_0>=91 && LA126_0<=96)||LA126_0==98||LA126_0==100||(LA126_0>=102 && LA126_0<=105)) ) {
                    	        alt126=1;
                    	    }
                    	    switch (alt126) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5194:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_30, grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2());

                    	    }
                    	    // InternalQVTimperative.g:5208:1: ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )?
                    	    int alt127=2;
                    	    int LA127_0 = input.LA(1);

                    	    if ( ((LA127_0>=RULE_SINGLE_QUOTED_STRING && LA127_0<=RULE_ESCAPED_ID)||LA127_0==17||LA127_0==19||(LA127_0>=22 && LA127_0<=23)||(LA127_0>=25 && LA127_0<=26)||(LA127_0>=29 && LA127_0<=34)||LA127_0==39||(LA127_0>=42 && LA127_0<=48)||(LA127_0>=50 && LA127_0<=52)||(LA127_0>=54 && LA127_0<=56)||(LA127_0>=58 && LA127_0<=60)||(LA127_0>=62 && LA127_0<=70)||LA127_0==72||LA127_0==74||LA127_0==76||LA127_0==79||LA127_0==81||LA127_0==83||(LA127_0>=85 && LA127_0<=89)||(LA127_0>=91 && LA127_0<=96)||LA127_0==98||LA127_0==100||(LA127_0>=102 && LA127_0<=108)||(LA127_0>=127 && LA127_0<=141)||LA127_0==143||(LA127_0>=145 && LA127_0<=148)||LA127_0==154||(LA127_0>=159 && LA127_0<=160)) ) {
                    	        alt127=1;
                    	    }
                    	    switch (alt127) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5209:1: (lv_ownedBodyExpressions_31_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTimperative.g:5209:1: (lv_ownedBodyExpressions_31_0= ruleSpecificationCS )
                    	            // InternalQVTimperative.g:5210:3: lv_ownedBodyExpressions_31_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_9);
                    	            lv_ownedBodyExpressions_31_0=ruleSpecificationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedBodyExpressions",
                    	                      		lv_ownedBodyExpressions_31_0,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_32, grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_4());

                    	    }

                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_33, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:5235:7: otherlv_34= ';'
                    {
                    otherlv_34=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_34, grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleParameterCS"
    // InternalQVTimperative.g:5247:1: entryRuleParameterCS returns [EObject current=null] : iv_ruleParameterCS= ruleParameterCS EOF ;
    public final EObject entryRuleParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParameterCS = null;


        try {
            // InternalQVTimperative.g:5248:2: (iv_ruleParameterCS= ruleParameterCS EOF )
            // InternalQVTimperative.g:5249:2: iv_ruleParameterCS= ruleParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParameterCS=ruleParameterCS();

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

            }

        }

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


    // $ANTLR start "ruleParameterCS"
    // InternalQVTimperative.g:5256:1: ruleParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? ) ;
    public final EObject ruleParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_qualifiers_4_0=null;
        Token lv_qualifiers_5_0=null;
        Token lv_qualifiers_6_0=null;
        Token lv_qualifiers_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:5259:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? ) )
            // InternalQVTimperative.g:5260:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? )
            {
            // InternalQVTimperative.g:5260:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? )
            // InternalQVTimperative.g:5260:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )?
            {
            // InternalQVTimperative.g:5260:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:5261:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:5261:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:5262:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_98);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:5278:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==24) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalQVTimperative.g:5278:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getParameterCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTimperative.g:5282:1: ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTimperative.g:5283:1: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTimperative.g:5283:1: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTimperative.g:5284:3: lv_ownedType_2_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_99);
                    lv_ownedType_2_0=ruleTypedMultiplicityRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getParameterCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_2_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:5300:4: (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==35) ) {
                int LA134_1 = input.LA(2);

                if ( ((LA134_1>=74 && LA134_1<=75)||(LA134_1>=79 && LA134_1<=80)) ) {
                    alt134=1;
                }
            }
            switch (alt134) {
                case 1 :
                    // InternalQVTimperative.g:5300:6: otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}'
                    {
                    otherlv_3=(Token)match(input,35,FollowSets000.FOLLOW_100); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());

                    }
                    // InternalQVTimperative.g:5304:1: ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+
                    int cnt133=0;
                    loop133:
                    do {
                        int alt133=2;
                        int LA133_0 = input.LA(1);

                        if ( ((LA133_0>=74 && LA133_0<=75)||(LA133_0>=79 && LA133_0<=80)) ) {
                            alt133=1;
                        }


                        switch (alt133) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5304:2: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )?
                    	    {
                    	    // InternalQVTimperative.g:5304:2: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) )
                    	    int alt131=4;
                    	    switch ( input.LA(1) ) {
                    	    case 74:
                    	        {
                    	        alt131=1;
                    	        }
                    	        break;
                    	    case 75:
                    	        {
                    	        alt131=2;
                    	        }
                    	        break;
                    	    case 79:
                    	        {
                    	        alt131=3;
                    	        }
                    	        break;
                    	    case 80:
                    	        {
                    	        alt131=4;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 131, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt131) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5304:3: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5304:3: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            // InternalQVTimperative.g:5305:1: (lv_qualifiers_4_0= 'ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5305:1: (lv_qualifiers_4_0= 'ordered' )
                    	            // InternalQVTimperative.g:5306:3: lv_qualifiers_4_0= 'ordered'
                    	            {
                    	            lv_qualifiers_4_0=(Token)match(input,74,FollowSets000.FOLLOW_101); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_4_0, grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getParameterCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_4_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:5320:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5320:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            // InternalQVTimperative.g:5321:1: (lv_qualifiers_5_0= '!ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5321:1: (lv_qualifiers_5_0= '!ordered' )
                    	            // InternalQVTimperative.g:5322:3: lv_qualifiers_5_0= '!ordered'
                    	            {
                    	            lv_qualifiers_5_0=(Token)match(input,75,FollowSets000.FOLLOW_101); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_5_0, grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getParameterCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_5_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTimperative.g:5336:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5336:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            // InternalQVTimperative.g:5337:1: (lv_qualifiers_6_0= 'unique' )
                    	            {
                    	            // InternalQVTimperative.g:5337:1: (lv_qualifiers_6_0= 'unique' )
                    	            // InternalQVTimperative.g:5338:3: lv_qualifiers_6_0= 'unique'
                    	            {
                    	            lv_qualifiers_6_0=(Token)match(input,79,FollowSets000.FOLLOW_101); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_6_0, grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getParameterCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_6_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTimperative.g:5352:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5352:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            // InternalQVTimperative.g:5353:1: (lv_qualifiers_7_0= '!unique' )
                    	            {
                    	            // InternalQVTimperative.g:5353:1: (lv_qualifiers_7_0= '!unique' )
                    	            // InternalQVTimperative.g:5354:3: lv_qualifiers_7_0= '!unique'
                    	            {
                    	            lv_qualifiers_7_0=(Token)match(input,80,FollowSets000.FOLLOW_101); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_7_0, grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getParameterCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_7_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTimperative.g:5367:3: (otherlv_8= ',' )?
                    	    int alt132=2;
                    	    int LA132_0 = input.LA(1);

                    	    if ( (LA132_0==18) ) {
                    	        alt132=1;
                    	    }
                    	    switch (alt132) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5367:5: otherlv_8= ','
                    	            {
                    	            otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_102); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_8, grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_9, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:5375:3: (otherlv_10= '{' otherlv_11= '}' )?
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==35) ) {
                alt135=1;
            }
            switch (alt135) {
                case 1 :
                    // InternalQVTimperative.g:5375:5: otherlv_10= '{' otherlv_11= '}'
                    {
                    otherlv_10=(Token)match(input,35,FollowSets000.FOLLOW_58); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());

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

                          	newLeafNode(otherlv_11, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleReferenceCS"
    // InternalQVTimperative.g:5391:1: entryRuleReferenceCS returns [EObject current=null] : iv_ruleReferenceCS= ruleReferenceCS EOF ;
    public final EObject entryRuleReferenceCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReferenceCS = null;


        try {
            // InternalQVTimperative.g:5392:2: (iv_ruleReferenceCS= ruleReferenceCS EOF )
            // InternalQVTimperative.g:5393:2: iv_ruleReferenceCS= ruleReferenceCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReferenceCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleReferenceCS=ruleReferenceCS();

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

            }

        }

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


    // $ANTLR start "ruleReferenceCS"
    // InternalQVTimperative.g:5400:1: ruleReferenceCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) ) ;
    public final EObject ruleReferenceCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token lv_default_11_0=null;
        Token otherlv_12=null;
        Token lv_qualifiers_13_0=null;
        Token lv_qualifiers_14_0=null;
        Token lv_qualifiers_15_0=null;
        Token lv_qualifiers_16_0=null;
        Token lv_qualifiers_17_0=null;
        Token lv_qualifiers_18_0=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token lv_qualifiers_25_0=null;
        Token lv_qualifiers_26_0=null;
        Token lv_qualifiers_27_0=null;
        Token lv_qualifiers_28_0=null;
        Token lv_qualifiers_29_0=null;
        Token lv_qualifiers_30_0=null;
        Token otherlv_31=null;
        Token otherlv_32=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token otherlv_39=null;
        Token otherlv_41=null;
        Token otherlv_43=null;
        Token otherlv_44=null;
        Token otherlv_45=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_9_0 = null;

        EObject lv_ownedDefaultExpressions_37_0 = null;

        EObject lv_ownedDefaultExpressions_42_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:5403:28: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) ) )
            // InternalQVTimperative.g:5404:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) )
            {
            // InternalQVTimperative.g:5404:1: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) )
            // InternalQVTimperative.g:5404:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' )
            {
            // InternalQVTimperative.g:5404:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt138=3;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==67) ) {
                alt138=1;
            }
            else if ( (LA138_0==68) ) {
                alt138=2;
            }
            switch (alt138) {
                case 1 :
                    // InternalQVTimperative.g:5404:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTimperative.g:5404:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTimperative.g:5404:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTimperative.g:5404:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTimperative.g:5405:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTimperative.g:5405:1: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTimperative.g:5406:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,67,FollowSets000.FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_0_0, grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getReferenceCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTimperative.g:5419:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt136=2;
                    int LA136_0 = input.LA(1);

                    if ( (LA136_0==68) ) {
                        alt136=1;
                    }
                    switch (alt136) {
                        case 1 :
                            // InternalQVTimperative.g:5420:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTimperative.g:5420:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTimperative.g:5421:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,68,FollowSets000.FOLLOW_104); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_1_0, grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:5435:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTimperative.g:5435:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTimperative.g:5435:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTimperative.g:5435:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTimperative.g:5436:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTimperative.g:5436:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTimperative.g:5437:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,68,FollowSets000.FOLLOW_105); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_qualifiers_2_0, grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getReferenceCSRule());
                      	        }
                             		addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTimperative.g:5450:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt137=2;
                    int LA137_0 = input.LA(1);

                    if ( (LA137_0==67) ) {
                        alt137=1;
                    }
                    switch (alt137) {
                        case 1 :
                            // InternalQVTimperative.g:5451:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTimperative.g:5451:1: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTimperative.g:5452:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,67,FollowSets000.FOLLOW_104); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_qualifiers_3_0, grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                              	        }
                                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,96,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());

            }
            // InternalQVTimperative.g:5469:1: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:5470:1: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:5470:1: (lv_name_5_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:5471:3: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_106);
            lv_name_5_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_5_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:5487:2: (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )?
            int alt139=2;
            int LA139_0 = input.LA(1);

            if ( (LA139_0==97) ) {
                alt139=1;
            }
            switch (alt139) {
                case 1 :
                    // InternalQVTimperative.g:5487:4: otherlv_6= '#' ( ( ruleUnrestrictedName ) )
                    {
                    otherlv_6=(Token)match(input,97,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());

                    }
                    // InternalQVTimperative.g:5491:1: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:5492:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:5492:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:5493:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getReferenceCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_49);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:5509:4: (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==24) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalQVTimperative.g:5509:6: otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_8=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTimperative.g:5513:1: ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTimperative.g:5514:1: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTimperative.g:5514:1: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTimperative.g:5515:3: lv_ownedType_9_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_50);
                    lv_ownedType_9_0=ruleTypedMultiplicityRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_9_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:5531:4: (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt141=2;
            int LA141_0 = input.LA(1);

            if ( (LA141_0==53) ) {
                alt141=1;
            }
            switch (alt141) {
                case 1 :
                    // InternalQVTimperative.g:5531:6: otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_10=(Token)match(input,53,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());

                    }
                    // InternalQVTimperative.g:5535:1: ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:5536:1: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:5536:1: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:5537:3: lv_default_11_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_11_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_default_11_0, grammarAccess.getReferenceCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getReferenceCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"default",
                              		lv_default_11_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:5553:4: (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )?
            int alt145=2;
            int LA145_0 = input.LA(1);

            if ( (LA145_0==35) ) {
                int LA145_1 = input.LA(2);

                if ( (LA145_1==54||(LA145_1>=70 && LA145_1<=71)||(LA145_1>=74 && LA145_1<=84)||(LA145_1>=98 && LA145_1<=101)) ) {
                    alt145=1;
                }
            }
            switch (alt145) {
                case 1 :
                    // InternalQVTimperative.g:5553:6: otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}'
                    {
                    otherlv_12=(Token)match(input,35,FollowSets000.FOLLOW_107); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalQVTimperative.g:5557:1: ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+
                    int cnt144=0;
                    loop144:
                    do {
                        int alt144=2;
                        int LA144_0 = input.LA(1);

                        if ( (LA144_0==54||(LA144_0>=70 && LA144_0<=71)||(LA144_0>=74 && LA144_0<=84)||(LA144_0>=98 && LA144_0<=101)) ) {
                            alt144=1;
                        }


                        switch (alt144) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5557:2: ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )?
                    	    {
                    	    // InternalQVTimperative.g:5557:2: ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) )
                    	    int alt142=18;
                    	    switch ( input.LA(1) ) {
                    	    case 98:
                    	        {
                    	        alt142=1;
                    	        }
                    	        break;
                    	    case 99:
                    	        {
                    	        alt142=2;
                    	        }
                    	        break;
                    	    case 70:
                    	        {
                    	        alt142=3;
                    	        }
                    	        break;
                    	    case 71:
                    	        {
                    	        alt142=4;
                    	        }
                    	        break;
                    	    case 74:
                    	        {
                    	        alt142=5;
                    	        }
                    	        break;
                    	    case 75:
                    	        {
                    	        alt142=6;
                    	        }
                    	        break;
                    	    case 76:
                    	        {
                    	        alt142=7;
                    	        }
                    	        break;
                    	    case 77:
                    	        {
                    	        alt142=8;
                    	        }
                    	        break;
                    	    case 100:
                    	        {
                    	        alt142=9;
                    	        }
                    	        break;
                    	    case 101:
                    	        {
                    	        alt142=10;
                    	        }
                    	        break;
                    	    case 54:
                    	        {
                    	        alt142=11;
                    	        }
                    	        break;
                    	    case 78:
                    	        {
                    	        alt142=12;
                    	        }
                    	        break;
                    	    case 79:
                    	        {
                    	        alt142=13;
                    	        }
                    	        break;
                    	    case 80:
                    	        {
                    	        alt142=14;
                    	        }
                    	        break;
                    	    case 81:
                    	        {
                    	        alt142=15;
                    	        }
                    	        break;
                    	    case 82:
                    	        {
                    	        alt142=16;
                    	        }
                    	        break;
                    	    case 83:
                    	        {
                    	        alt142=17;
                    	        }
                    	        break;
                    	    case 84:
                    	        {
                    	        alt142=18;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 142, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt142) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5557:3: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            {
                    	            // InternalQVTimperative.g:5557:3: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            // InternalQVTimperative.g:5558:1: (lv_qualifiers_13_0= 'composes' )
                    	            {
                    	            // InternalQVTimperative.g:5558:1: (lv_qualifiers_13_0= 'composes' )
                    	            // InternalQVTimperative.g:5559:3: lv_qualifiers_13_0= 'composes'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,98,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_13_0, grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_13_0, "composes");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:5573:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            {
                    	            // InternalQVTimperative.g:5573:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            // InternalQVTimperative.g:5574:1: (lv_qualifiers_14_0= '!composes' )
                    	            {
                    	            // InternalQVTimperative.g:5574:1: (lv_qualifiers_14_0= '!composes' )
                    	            // InternalQVTimperative.g:5575:3: lv_qualifiers_14_0= '!composes'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,99,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_14_0, grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_14_0, "!composes");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTimperative.g:5589:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:5589:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            // InternalQVTimperative.g:5590:1: (lv_qualifiers_15_0= 'derived' )
                    	            {
                    	            // InternalQVTimperative.g:5590:1: (lv_qualifiers_15_0= 'derived' )
                    	            // InternalQVTimperative.g:5591:3: lv_qualifiers_15_0= 'derived'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,70,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_15_0, grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_15_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTimperative.g:5605:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            {
                    	            // InternalQVTimperative.g:5605:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            // InternalQVTimperative.g:5606:1: (lv_qualifiers_16_0= '!derived' )
                    	            {
                    	            // InternalQVTimperative.g:5606:1: (lv_qualifiers_16_0= '!derived' )
                    	            // InternalQVTimperative.g:5607:3: lv_qualifiers_16_0= '!derived'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,71,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_16_0, grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_16_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTimperative.g:5621:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5621:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            // InternalQVTimperative.g:5622:1: (lv_qualifiers_17_0= 'ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5622:1: (lv_qualifiers_17_0= 'ordered' )
                    	            // InternalQVTimperative.g:5623:3: lv_qualifiers_17_0= 'ordered'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,74,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_17_0, grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_17_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTimperative.g:5637:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTimperative.g:5637:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            // InternalQVTimperative.g:5638:1: (lv_qualifiers_18_0= '!ordered' )
                    	            {
                    	            // InternalQVTimperative.g:5638:1: (lv_qualifiers_18_0= '!ordered' )
                    	            // InternalQVTimperative.g:5639:3: lv_qualifiers_18_0= '!ordered'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,75,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_18_0, grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_18_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 7 :
                    	            // InternalQVTimperative.g:5653:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            {
                    	            // InternalQVTimperative.g:5653:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            // InternalQVTimperative.g:5654:1: (lv_qualifiers_19_0= 'readonly' )
                    	            {
                    	            // InternalQVTimperative.g:5654:1: (lv_qualifiers_19_0= 'readonly' )
                    	            // InternalQVTimperative.g:5655:3: lv_qualifiers_19_0= 'readonly'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,76,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_19_0, grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 8 :
                    	            // InternalQVTimperative.g:5669:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            {
                    	            // InternalQVTimperative.g:5669:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            // InternalQVTimperative.g:5670:1: (lv_qualifiers_20_0= '!readonly' )
                    	            {
                    	            // InternalQVTimperative.g:5670:1: (lv_qualifiers_20_0= '!readonly' )
                    	            // InternalQVTimperative.g:5671:3: lv_qualifiers_20_0= '!readonly'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,77,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_20_0, grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 9 :
                    	            // InternalQVTimperative.g:5685:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            {
                    	            // InternalQVTimperative.g:5685:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            // InternalQVTimperative.g:5686:1: (lv_qualifiers_21_0= 'resolve' )
                    	            {
                    	            // InternalQVTimperative.g:5686:1: (lv_qualifiers_21_0= 'resolve' )
                    	            // InternalQVTimperative.g:5687:3: lv_qualifiers_21_0= 'resolve'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,100,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_21_0, grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "resolve");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 10 :
                    	            // InternalQVTimperative.g:5701:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            {
                    	            // InternalQVTimperative.g:5701:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            // InternalQVTimperative.g:5702:1: (lv_qualifiers_22_0= '!resolve' )
                    	            {
                    	            // InternalQVTimperative.g:5702:1: (lv_qualifiers_22_0= '!resolve' )
                    	            // InternalQVTimperative.g:5703:3: lv_qualifiers_22_0= '!resolve'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,101,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_22_0, grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!resolve");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 11 :
                    	            // InternalQVTimperative.g:5717:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            {
                    	            // InternalQVTimperative.g:5717:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            // InternalQVTimperative.g:5718:1: (lv_qualifiers_23_0= 'transient' )
                    	            {
                    	            // InternalQVTimperative.g:5718:1: (lv_qualifiers_23_0= 'transient' )
                    	            // InternalQVTimperative.g:5719:3: lv_qualifiers_23_0= 'transient'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,54,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_23_0, grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 12 :
                    	            // InternalQVTimperative.g:5733:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            {
                    	            // InternalQVTimperative.g:5733:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            // InternalQVTimperative.g:5734:1: (lv_qualifiers_24_0= '!transient' )
                    	            {
                    	            // InternalQVTimperative.g:5734:1: (lv_qualifiers_24_0= '!transient' )
                    	            // InternalQVTimperative.g:5735:3: lv_qualifiers_24_0= '!transient'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,78,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_24_0, grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 13 :
                    	            // InternalQVTimperative.g:5749:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5749:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            // InternalQVTimperative.g:5750:1: (lv_qualifiers_25_0= 'unique' )
                    	            {
                    	            // InternalQVTimperative.g:5750:1: (lv_qualifiers_25_0= 'unique' )
                    	            // InternalQVTimperative.g:5751:3: lv_qualifiers_25_0= 'unique'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,79,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_25_0, grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_25_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 14 :
                    	            // InternalQVTimperative.g:5765:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            {
                    	            // InternalQVTimperative.g:5765:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            // InternalQVTimperative.g:5766:1: (lv_qualifiers_26_0= '!unique' )
                    	            {
                    	            // InternalQVTimperative.g:5766:1: (lv_qualifiers_26_0= '!unique' )
                    	            // InternalQVTimperative.g:5767:3: lv_qualifiers_26_0= '!unique'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,80,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_26_0, grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_26_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 15 :
                    	            // InternalQVTimperative.g:5781:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            {
                    	            // InternalQVTimperative.g:5781:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            // InternalQVTimperative.g:5782:1: (lv_qualifiers_27_0= 'unsettable' )
                    	            {
                    	            // InternalQVTimperative.g:5782:1: (lv_qualifiers_27_0= 'unsettable' )
                    	            // InternalQVTimperative.g:5783:3: lv_qualifiers_27_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_27_0=(Token)match(input,81,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_27_0, grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_27_0, "unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 16 :
                    	            // InternalQVTimperative.g:5797:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            {
                    	            // InternalQVTimperative.g:5797:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            // InternalQVTimperative.g:5798:1: (lv_qualifiers_28_0= '!unsettable' )
                    	            {
                    	            // InternalQVTimperative.g:5798:1: (lv_qualifiers_28_0= '!unsettable' )
                    	            // InternalQVTimperative.g:5799:3: lv_qualifiers_28_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_28_0=(Token)match(input,82,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_28_0, grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_28_0, "!unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 17 :
                    	            // InternalQVTimperative.g:5813:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            {
                    	            // InternalQVTimperative.g:5813:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            // InternalQVTimperative.g:5814:1: (lv_qualifiers_29_0= 'volatile' )
                    	            {
                    	            // InternalQVTimperative.g:5814:1: (lv_qualifiers_29_0= 'volatile' )
                    	            // InternalQVTimperative.g:5815:3: lv_qualifiers_29_0= 'volatile'
                    	            {
                    	            lv_qualifiers_29_0=(Token)match(input,83,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_29_0, grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_29_0, "volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 18 :
                    	            // InternalQVTimperative.g:5829:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            {
                    	            // InternalQVTimperative.g:5829:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            // InternalQVTimperative.g:5830:1: (lv_qualifiers_30_0= '!volatile' )
                    	            {
                    	            // InternalQVTimperative.g:5830:1: (lv_qualifiers_30_0= '!volatile' )
                    	            // InternalQVTimperative.g:5831:3: lv_qualifiers_30_0= '!volatile'
                    	            {
                    	            lv_qualifiers_30_0=(Token)match(input,84,FollowSets000.FOLLOW_108); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_30_0, grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_30_0, "!volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTimperative.g:5844:3: (otherlv_31= ',' )?
                    	    int alt143=2;
                    	    int LA143_0 = input.LA(1);

                    	    if ( (LA143_0==18) ) {
                    	        alt143=1;
                    	    }
                    	    switch (alt143) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5844:5: otherlv_31= ','
                    	            {
                    	            otherlv_31=(Token)match(input,18,FollowSets000.FOLLOW_109); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_31, grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

                    otherlv_32=(Token)match(input,36,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_32, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:5852:3: ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' )
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==35) ) {
                alt151=1;
            }
            else if ( (LA151_0==21) ) {
                alt151=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 151, 0, input);

                throw nvae;
            }
            switch (alt151) {
                case 1 :
                    // InternalQVTimperative.g:5852:4: (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' )
                    {
                    // InternalQVTimperative.g:5852:4: (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' )
                    // InternalQVTimperative.g:5852:6: otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}'
                    {
                    otherlv_33=(Token)match(input,35,FollowSets000.FOLLOW_77); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_33, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalQVTimperative.g:5856:1: ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )*
                    loop150:
                    do {
                        int alt150=3;
                        int LA150_0 = input.LA(1);

                        if ( (LA150_0==85) ) {
                            alt150=1;
                        }
                        else if ( (LA150_0==86) ) {
                            alt150=2;
                        }


                        switch (alt150) {
                    	case 1 :
                    	    // InternalQVTimperative.g:5856:2: (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' )
                    	    {
                    	    // InternalQVTimperative.g:5856:2: (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' )
                    	    // InternalQVTimperative.g:5856:4: otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';'
                    	    {
                    	    otherlv_34=(Token)match(input,85,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_34, grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_0_0());

                    	    }
                    	    // InternalQVTimperative.g:5860:1: ( ruleUnrestrictedName )?
                    	    int alt146=2;
                    	    int LA146_0 = input.LA(1);

                    	    if ( ((LA146_0>=RULE_SIMPLE_ID && LA146_0<=RULE_ESCAPED_ID)||LA146_0==17||LA146_0==19||(LA146_0>=22 && LA146_0<=23)||(LA146_0>=25 && LA146_0<=26)||(LA146_0>=29 && LA146_0<=34)||LA146_0==39||(LA146_0>=43 && LA146_0<=48)||(LA146_0>=50 && LA146_0<=52)||(LA146_0>=54 && LA146_0<=55)||(LA146_0>=58 && LA146_0<=60)||(LA146_0>=62 && LA146_0<=70)||LA146_0==72||LA146_0==74||LA146_0==76||LA146_0==79||LA146_0==81||LA146_0==83||(LA146_0>=85 && LA146_0<=89)||(LA146_0>=91 && LA146_0<=96)||LA146_0==98||LA146_0==100||(LA146_0>=102 && LA146_0<=105)) ) {
                    	        alt146=1;
                    	    }
                    	    switch (alt146) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5861:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_36, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_0_2());

                    	    }
                    	    // InternalQVTimperative.g:5875:1: ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )?
                    	    int alt147=2;
                    	    int LA147_0 = input.LA(1);

                    	    if ( ((LA147_0>=RULE_SINGLE_QUOTED_STRING && LA147_0<=RULE_ESCAPED_ID)||LA147_0==17||LA147_0==19||(LA147_0>=22 && LA147_0<=23)||(LA147_0>=25 && LA147_0<=26)||(LA147_0>=29 && LA147_0<=34)||LA147_0==39||(LA147_0>=42 && LA147_0<=48)||(LA147_0>=50 && LA147_0<=52)||(LA147_0>=54 && LA147_0<=56)||(LA147_0>=58 && LA147_0<=60)||(LA147_0>=62 && LA147_0<=70)||LA147_0==72||LA147_0==74||LA147_0==76||LA147_0==79||LA147_0==81||LA147_0==83||(LA147_0>=85 && LA147_0<=89)||(LA147_0>=91 && LA147_0<=96)||LA147_0==98||LA147_0==100||(LA147_0>=102 && LA147_0<=108)||(LA147_0>=127 && LA147_0<=141)||LA147_0==143||(LA147_0>=145 && LA147_0<=148)||LA147_0==154||(LA147_0>=159 && LA147_0<=160)) ) {
                    	        alt147=1;
                    	    }
                    	    switch (alt147) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5876:1: (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTimperative.g:5876:1: (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS )
                    	            // InternalQVTimperative.g:5877:3: lv_ownedDefaultExpressions_37_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_0_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_9);
                    	            lv_ownedDefaultExpressions_37_0=ruleSpecificationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedDefaultExpressions",
                    	                      		lv_ownedDefaultExpressions_37_0,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_38, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_0_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTimperative.g:5898:6: (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' )
                    	    {
                    	    // InternalQVTimperative.g:5898:6: (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' )
                    	    // InternalQVTimperative.g:5898:8: otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';'
                    	    {
                    	    otherlv_39=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_39, grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_1_0());

                    	    }
                    	    // InternalQVTimperative.g:5902:1: ( ruleUnrestrictedName )?
                    	    int alt148=2;
                    	    int LA148_0 = input.LA(1);

                    	    if ( ((LA148_0>=RULE_SIMPLE_ID && LA148_0<=RULE_ESCAPED_ID)||LA148_0==17||LA148_0==19||(LA148_0>=22 && LA148_0<=23)||(LA148_0>=25 && LA148_0<=26)||(LA148_0>=29 && LA148_0<=34)||LA148_0==39||(LA148_0>=43 && LA148_0<=48)||(LA148_0>=50 && LA148_0<=52)||(LA148_0>=54 && LA148_0<=55)||(LA148_0>=58 && LA148_0<=60)||(LA148_0>=62 && LA148_0<=70)||LA148_0==72||LA148_0==74||LA148_0==76||LA148_0==79||LA148_0==81||LA148_0==83||(LA148_0>=85 && LA148_0<=89)||(LA148_0>=91 && LA148_0<=96)||LA148_0==98||LA148_0==100||(LA148_0>=102 && LA148_0<=105)) ) {
                    	        alt148=1;
                    	    }
                    	    switch (alt148) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5903:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_41, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_1_2());

                    	    }
                    	    // InternalQVTimperative.g:5917:1: ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )?
                    	    int alt149=2;
                    	    int LA149_0 = input.LA(1);

                    	    if ( ((LA149_0>=RULE_SINGLE_QUOTED_STRING && LA149_0<=RULE_ESCAPED_ID)||LA149_0==17||LA149_0==19||(LA149_0>=22 && LA149_0<=23)||(LA149_0>=25 && LA149_0<=26)||(LA149_0>=29 && LA149_0<=34)||LA149_0==39||(LA149_0>=42 && LA149_0<=48)||(LA149_0>=50 && LA149_0<=52)||(LA149_0>=54 && LA149_0<=56)||(LA149_0>=58 && LA149_0<=60)||(LA149_0>=62 && LA149_0<=70)||LA149_0==72||LA149_0==74||LA149_0==76||LA149_0==79||LA149_0==81||LA149_0==83||(LA149_0>=85 && LA149_0<=89)||(LA149_0>=91 && LA149_0<=96)||LA149_0==98||LA149_0==100||(LA149_0>=102 && LA149_0<=108)||(LA149_0>=127 && LA149_0<=141)||LA149_0==143||(LA149_0>=145 && LA149_0<=148)||LA149_0==154||(LA149_0>=159 && LA149_0<=160)) ) {
                    	        alt149=1;
                    	    }
                    	    switch (alt149) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:5918:1: (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTimperative.g:5918:1: (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS )
                    	            // InternalQVTimperative.g:5919:3: lv_ownedDefaultExpressions_42_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_9);
                    	            lv_ownedDefaultExpressions_42_0=ruleSpecificationCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedDefaultExpressions",
                    	                      		lv_ownedDefaultExpressions_42_0,
                    	                      		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

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

                    	          	newLeafNode(otherlv_43, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_4());

                    	    }

                    	    }


                    	    }
                    	    break;

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

                    otherlv_44=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_44, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:5944:7: otherlv_45= ';'
                    {
                    otherlv_45=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_45, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSimpleTargetElementCS"
    // InternalQVTimperative.g:5956:1: entryRuleSimpleTargetElementCS returns [EObject current=null] : iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF ;
    public final EObject entryRuleSimpleTargetElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSimpleTargetElementCS = null;


        try {
            // InternalQVTimperative.g:5957:2: (iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF )
            // InternalQVTimperative.g:5958:2: iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSimpleTargetElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSimpleTargetElementCS=ruleSimpleTargetElementCS();

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

            }

        }

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


    // $ANTLR start "ruleSimpleTargetElementCS"
    // InternalQVTimperative.g:5965:1: ruleSimpleTargetElementCS returns [EObject current=null] : ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' ) ;
    public final EObject ruleSimpleTargetElementCS() throws RecognitionException {
        EObject current = null;

        Token lv_input_0_0=null;
        Token lv_output_1_0=null;
        Token lv_via_2_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;

         enterRule();

        try {
            // InternalQVTimperative.g:5968:28: ( ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' ) )
            // InternalQVTimperative.g:5969:1: ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' )
            {
            // InternalQVTimperative.g:5969:1: ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' )
            // InternalQVTimperative.g:5969:2: ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';'
            {
            // InternalQVTimperative.g:5969:2: ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) )
            int alt152=3;
            switch ( input.LA(1) ) {
            case 33:
                {
                alt152=1;
                }
                break;
            case 34:
                {
                alt152=2;
                }
                break;
            case 66:
                {
                alt152=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 152, 0, input);

                throw nvae;
            }

            switch (alt152) {
                case 1 :
                    // InternalQVTimperative.g:5969:3: ( (lv_input_0_0= 'input' ) )
                    {
                    // InternalQVTimperative.g:5969:3: ( (lv_input_0_0= 'input' ) )
                    // InternalQVTimperative.g:5970:1: (lv_input_0_0= 'input' )
                    {
                    // InternalQVTimperative.g:5970:1: (lv_input_0_0= 'input' )
                    // InternalQVTimperative.g:5971:3: lv_input_0_0= 'input'
                    {
                    lv_input_0_0=(Token)match(input,33,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_input_0_0, grammarAccess.getSimpleTargetElementCSAccess().getInputInputKeyword_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:5985:6: ( (lv_output_1_0= 'output' ) )
                    {
                    // InternalQVTimperative.g:5985:6: ( (lv_output_1_0= 'output' ) )
                    // InternalQVTimperative.g:5986:1: (lv_output_1_0= 'output' )
                    {
                    // InternalQVTimperative.g:5986:1: (lv_output_1_0= 'output' )
                    // InternalQVTimperative.g:5987:3: lv_output_1_0= 'output'
                    {
                    lv_output_1_0=(Token)match(input,34,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_output_1_0, grammarAccess.getSimpleTargetElementCSAccess().getOutputOutputKeyword_0_1_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:6001:6: ( (lv_via_2_0= 'via' ) )
                    {
                    // InternalQVTimperative.g:6001:6: ( (lv_via_2_0= 'via' ) )
                    // InternalQVTimperative.g:6002:1: (lv_via_2_0= 'via' )
                    {
                    // InternalQVTimperative.g:6002:1: (lv_via_2_0= 'via' )
                    // InternalQVTimperative.g:6003:3: lv_via_2_0= 'via'
                    {
                    lv_via_2_0=(Token)match(input,66,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_via_2_0, grammarAccess.getSimpleTargetElementCSAccess().getViaViaKeyword_0_2_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:6016:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:6017:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:6017:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:6018:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getTypedModelTypedModelCrossReference_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_110);
            ruleUnrestrictedName();

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

              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:6034:2: (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )?
            int alt156=2;
            int LA156_0 = input.LA(1);

            if ( (LA156_0==43) ) {
                alt156=1;
            }
            switch (alt156) {
                case 1 :
                    // InternalQVTimperative.g:6034:4: otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) )
                    {
                    otherlv_4=(Token)match(input,43,FollowSets000.FOLLOW_111); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getSimpleTargetElementCSAccess().getIteratesKeyword_2_0());

                    }
                    // InternalQVTimperative.g:6038:1: ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) )
                    int alt155=2;
                    int LA155_0 = input.LA(1);

                    if ( ((LA155_0>=RULE_SIMPLE_ID && LA155_0<=RULE_ESCAPED_ID)||LA155_0==17||LA155_0==19||(LA155_0>=22 && LA155_0<=23)||(LA155_0>=25 && LA155_0<=26)||(LA155_0>=29 && LA155_0<=34)||LA155_0==39||(LA155_0>=43 && LA155_0<=48)||(LA155_0>=50 && LA155_0<=52)||(LA155_0>=54 && LA155_0<=55)||(LA155_0>=58 && LA155_0<=60)||(LA155_0>=62 && LA155_0<=70)||LA155_0==72||LA155_0==74||LA155_0==76||LA155_0==79||LA155_0==81||LA155_0==83||(LA155_0>=85 && LA155_0<=89)||(LA155_0>=91 && LA155_0<=96)||LA155_0==98||LA155_0==100||(LA155_0>=102 && LA155_0<=105)) ) {
                        alt155=1;
                    }
                    else if ( (LA155_0==35) ) {
                        alt155=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 155, 0, input);

                        throw nvae;
                    }
                    switch (alt155) {
                        case 1 :
                            // InternalQVTimperative.g:6038:2: ( ( ruleUnrestrictedName ) )
                            {
                            // InternalQVTimperative.g:6038:2: ( ( ruleUnrestrictedName ) )
                            // InternalQVTimperative.g:6039:1: ( ruleUnrestrictedName )
                            {
                            // InternalQVTimperative.g:6039:1: ( ruleUnrestrictedName )
                            // InternalQVTimperative.g:6040:3: ruleUnrestrictedName
                            {
                            if ( state.backtracking==0 ) {

                              		  /* */

                            }
                            if ( state.backtracking==0 ) {

                              			if (current==null) {
                              	            current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                              	        }

                            }
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_9);
                            ruleUnrestrictedName();

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

                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTimperative.g:6057:6: (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' )
                            {
                            // InternalQVTimperative.g:6057:6: (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' )
                            // InternalQVTimperative.g:6057:8: otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}'
                            {
                            otherlv_6=(Token)match(input,35,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_6, grammarAccess.getSimpleTargetElementCSAccess().getLeftCurlyBracketKeyword_2_1_1_0());

                            }
                            // InternalQVTimperative.g:6061:1: ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )?
                            int alt154=2;
                            int LA154_0 = input.LA(1);

                            if ( ((LA154_0>=RULE_SIMPLE_ID && LA154_0<=RULE_ESCAPED_ID)||LA154_0==17||LA154_0==19||(LA154_0>=22 && LA154_0<=23)||(LA154_0>=25 && LA154_0<=26)||(LA154_0>=29 && LA154_0<=34)||LA154_0==39||(LA154_0>=43 && LA154_0<=48)||(LA154_0>=50 && LA154_0<=52)||(LA154_0>=54 && LA154_0<=55)||(LA154_0>=58 && LA154_0<=60)||(LA154_0>=62 && LA154_0<=70)||LA154_0==72||LA154_0==74||LA154_0==76||LA154_0==79||LA154_0==81||LA154_0==83||(LA154_0>=85 && LA154_0<=89)||(LA154_0>=91 && LA154_0<=96)||LA154_0==98||LA154_0==100||(LA154_0>=102 && LA154_0<=105)) ) {
                                alt154=1;
                            }
                            switch (alt154) {
                                case 1 :
                                    // InternalQVTimperative.g:6061:2: ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                                    {
                                    // InternalQVTimperative.g:6061:2: ( ( ruleUnrestrictedName ) )
                                    // InternalQVTimperative.g:6062:1: ( ruleUnrestrictedName )
                                    {
                                    // InternalQVTimperative.g:6062:1: ( ruleUnrestrictedName )
                                    // InternalQVTimperative.g:6063:3: ruleUnrestrictedName
                                    {
                                    if ( state.backtracking==0 ) {

                                      		  /* */

                                    }
                                    if ( state.backtracking==0 ) {

                                      			if (current==null) {
                                      	            current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                                      	        }

                                    }
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_1_1_0_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_112);
                                    ruleUnrestrictedName();

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

                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }

                                    // InternalQVTimperative.g:6079:2: (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                                    loop153:
                                    do {
                                        int alt153=2;
                                        int LA153_0 = input.LA(1);

                                        if ( (LA153_0==18) ) {
                                            alt153=1;
                                        }


                                        switch (alt153) {
                                    	case 1 :
                                    	    // InternalQVTimperative.g:6079:4: otherlv_8= ',' ( ( ruleUnrestrictedName ) )
                                    	    {
                                    	    otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	          	newLeafNode(otherlv_8, grammarAccess.getSimpleTargetElementCSAccess().getCommaKeyword_2_1_1_1_1_0());

                                    	    }
                                    	    // InternalQVTimperative.g:6083:1: ( ( ruleUnrestrictedName ) )
                                    	    // InternalQVTimperative.g:6084:1: ( ruleUnrestrictedName )
                                    	    {
                                    	    // InternalQVTimperative.g:6084:1: ( ruleUnrestrictedName )
                                    	    // InternalQVTimperative.g:6085:3: ruleUnrestrictedName
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      		  /* */

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      			if (current==null) {
                                    	      	            current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                                    	      	        }

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      	        newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_1_1_1_1_0());

                                    	    }
                                    	    pushFollow(FollowSets000.FOLLOW_112);
                                    	    ruleUnrestrictedName();

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

                                    	      	        afterParserOrEnumRuleCall();

                                    	    }

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

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


                                    }
                                    break;

                            }

                            otherlv_10=(Token)match(input,36,FollowSets000.FOLLOW_9); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_10, grammarAccess.getSimpleTargetElementCSAccess().getRightCurlyBracketKeyword_2_1_1_2());

                            }

                            }


                            }
                            break;

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_11, grammarAccess.getSimpleTargetElementCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSpecificationCS"
    // InternalQVTimperative.g:6117:1: entryRuleSpecificationCS returns [EObject current=null] : iv_ruleSpecificationCS= ruleSpecificationCS EOF ;
    public final EObject entryRuleSpecificationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSpecificationCS = null;


        try {
            // InternalQVTimperative.g:6118:2: (iv_ruleSpecificationCS= ruleSpecificationCS EOF )
            // InternalQVTimperative.g:6119:2: iv_ruleSpecificationCS= ruleSpecificationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSpecificationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSpecificationCS=ruleSpecificationCS();

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

            }

        }

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


    // $ANTLR start "ruleSpecificationCS"
    // InternalQVTimperative.g:6126:1: ruleSpecificationCS returns [EObject current=null] : ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) ) ;
    public final EObject ruleSpecificationCS() throws RecognitionException {
        EObject current = null;

        Token lv_exprString_1_0=null;
        EObject lv_ownedExpression_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6129:28: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) ) )
            // InternalQVTimperative.g:6130:1: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            {
            // InternalQVTimperative.g:6130:1: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            int alt157=2;
            int LA157_0 = input.LA(1);

            if ( (LA157_0==RULE_SINGLE_QUOTED_STRING||(LA157_0>=RULE_INT && LA157_0<=RULE_ESCAPED_ID)||LA157_0==17||LA157_0==19||(LA157_0>=22 && LA157_0<=23)||(LA157_0>=25 && LA157_0<=26)||(LA157_0>=29 && LA157_0<=34)||LA157_0==39||(LA157_0>=42 && LA157_0<=48)||(LA157_0>=50 && LA157_0<=52)||(LA157_0>=54 && LA157_0<=56)||(LA157_0>=58 && LA157_0<=60)||(LA157_0>=62 && LA157_0<=70)||LA157_0==72||LA157_0==74||LA157_0==76||LA157_0==79||LA157_0==81||LA157_0==83||(LA157_0>=85 && LA157_0<=89)||(LA157_0>=91 && LA157_0<=96)||LA157_0==98||LA157_0==100||(LA157_0>=102 && LA157_0<=108)||(LA157_0>=127 && LA157_0<=141)||LA157_0==143||(LA157_0>=145 && LA157_0<=148)||LA157_0==154||(LA157_0>=159 && LA157_0<=160)) ) {
                alt157=1;
            }
            else if ( (LA157_0==RULE_UNQUOTED_STRING) ) {
                alt157=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 157, 0, input);

                throw nvae;
            }
            switch (alt157) {
                case 1 :
                    // InternalQVTimperative.g:6130:2: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    {
                    // InternalQVTimperative.g:6130:2: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalQVTimperative.g:6131:1: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:6131:1: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalQVTimperative.g:6132:3: lv_ownedExpression_0_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExpression_0_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getSpecificationCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_0_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6149:6: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    {
                    // InternalQVTimperative.g:6149:6: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    // InternalQVTimperative.g:6150:1: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    {
                    // InternalQVTimperative.g:6150:1: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    // InternalQVTimperative.g:6151:3: lv_exprString_1_0= RULE_UNQUOTED_STRING
                    {
                    lv_exprString_1_0=(Token)match(input,RULE_UNQUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_exprString_1_0, grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getSpecificationCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"exprString",
                              		lv_exprString_1_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.UNQUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleStructuredClassCS"
    // InternalQVTimperative.g:6175:1: entryRuleStructuredClassCS returns [EObject current=null] : iv_ruleStructuredClassCS= ruleStructuredClassCS EOF ;
    public final EObject entryRuleStructuredClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuredClassCS = null;


        try {
            // InternalQVTimperative.g:6176:2: (iv_ruleStructuredClassCS= ruleStructuredClassCS EOF )
            // InternalQVTimperative.g:6177:2: iv_ruleStructuredClassCS= ruleStructuredClassCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStructuredClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStructuredClassCS=ruleStructuredClassCS();

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

            }

        }

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


    // $ANTLR start "ruleStructuredClassCS"
    // InternalQVTimperative.g:6184:1: ruleStructuredClassCS returns [EObject current=null] : ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) ) ;
    public final EObject ruleStructuredClassCS() throws RecognitionException {
        EObject current = null;

        Token lv_isAbstract_0_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token lv_instanceClassName_9_0=null;
        Token otherlv_10=null;
        Token lv_isInterface_11_0=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_16=null;
        Token otherlv_17=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedSignature_3_0 = null;

        EObject lv_ownedSuperTypes_5_0 = null;

        EObject lv_ownedSuperTypes_7_0 = null;

        EObject lv_ownedOperations_14_0 = null;

        EObject lv_ownedProperties_15_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6187:28: ( ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) ) )
            // InternalQVTimperative.g:6188:1: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) )
            {
            // InternalQVTimperative.g:6188:1: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) )
            // InternalQVTimperative.g:6188:2: ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' )
            {
            // InternalQVTimperative.g:6188:2: ( (lv_isAbstract_0_0= 'abstract' ) )?
            int alt158=2;
            int LA158_0 = input.LA(1);

            if ( (LA158_0==102) ) {
                alt158=1;
            }
            switch (alt158) {
                case 1 :
                    // InternalQVTimperative.g:6189:1: (lv_isAbstract_0_0= 'abstract' )
                    {
                    // InternalQVTimperative.g:6189:1: (lv_isAbstract_0_0= 'abstract' )
                    // InternalQVTimperative.g:6190:3: lv_isAbstract_0_0= 'abstract'
                    {
                    lv_isAbstract_0_0=(Token)match(input,102,FollowSets000.FOLLOW_113); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isAbstract_0_0, grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());

            }
            // InternalQVTimperative.g:6207:1: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:6208:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:6208:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:6209:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_114);
            lv_name_2_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_2_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:6225:2: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( (LA159_0==56) ) {
                alt159=1;
            }
            switch (alt159) {
                case 1 :
                    // InternalQVTimperative.g:6226:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTimperative.g:6226:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalQVTimperative.g:6227:3: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_115);
                    lv_ownedSignature_3_0=ruleTemplateSignatureCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSignature",
                              		lv_ownedSignature_3_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:6243:3: (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==104) ) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // InternalQVTimperative.g:6243:5: otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_4=(Token)match(input,104,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());

                    }
                    // InternalQVTimperative.g:6247:1: ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) )
                    // InternalQVTimperative.g:6248:1: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    {
                    // InternalQVTimperative.g:6248:1: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    // InternalQVTimperative.g:6249:3: lv_ownedSuperTypes_5_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_116);
                    lv_ownedSuperTypes_5_0=ruleTypedRefCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedSuperTypes",
                              		lv_ownedSuperTypes_5_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:6265:2: (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    loop160:
                    do {
                        int alt160=2;
                        int LA160_0 = input.LA(1);

                        if ( (LA160_0==18) ) {
                            alt160=1;
                        }


                        switch (alt160) {
                    	case 1 :
                    	    // InternalQVTimperative.g:6265:4: otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_6=(Token)match(input,18,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_6, grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());

                    	    }
                    	    // InternalQVTimperative.g:6269:1: ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    // InternalQVTimperative.g:6270:1: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTimperative.g:6270:1: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    // InternalQVTimperative.g:6271:3: lv_ownedSuperTypes_7_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_116);
                    	    lv_ownedSuperTypes_7_0=ruleTypedRefCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedSuperTypes",
                    	              		lv_ownedSuperTypes_7_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalQVTimperative.g:6287:6: (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==24) ) {
                alt162=1;
            }
            switch (alt162) {
                case 1 :
                    // InternalQVTimperative.g:6287:8: otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,24,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());

                    }
                    // InternalQVTimperative.g:6291:1: ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTimperative.g:6292:1: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTimperative.g:6292:1: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTimperative.g:6293:3: lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_instanceClassName_9_0, grammarAccess.getStructuredClassCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getStructuredClassCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"instanceClassName",
                              		lv_instanceClassName_9_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:6309:4: (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )?
            int alt164=2;
            int LA164_0 = input.LA(1);

            if ( (LA164_0==35) ) {
                int LA164_1 = input.LA(2);

                if ( (LA164_1==105) ) {
                    alt164=1;
                }
                else if ( (LA164_1==36) ) {
                    int LA164_4 = input.LA(3);

                    if ( (LA164_4==21||LA164_4==35) ) {
                        alt164=1;
                    }
                }
            }
            switch (alt164) {
                case 1 :
                    // InternalQVTimperative.g:6309:6: otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}'
                    {
                    otherlv_10=(Token)match(input,35,FollowSets000.FOLLOW_117); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalQVTimperative.g:6313:1: ( (lv_isInterface_11_0= 'interface' ) )?
                    int alt163=2;
                    int LA163_0 = input.LA(1);

                    if ( (LA163_0==105) ) {
                        alt163=1;
                    }
                    switch (alt163) {
                        case 1 :
                            // InternalQVTimperative.g:6314:1: (lv_isInterface_11_0= 'interface' )
                            {
                            // InternalQVTimperative.g:6314:1: (lv_isInterface_11_0= 'interface' )
                            // InternalQVTimperative.g:6315:3: lv_isInterface_11_0= 'interface'
                            {
                            lv_isInterface_11_0=(Token)match(input,105,FollowSets000.FOLLOW_58); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                      newLeafNode(lv_isInterface_11_0, grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getStructuredClassCSRule());
                              	        }
                                     		setWithLastConsumed(current, "isInterface", true, "interface");

                            }

                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,36,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:6332:3: ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' )
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( (LA166_0==35) ) {
                alt166=1;
            }
            else if ( (LA166_0==21) ) {
                alt166=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 166, 0, input);

                throw nvae;
            }
            switch (alt166) {
                case 1 :
                    // InternalQVTimperative.g:6332:4: (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' )
                    {
                    // InternalQVTimperative.g:6332:4: (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' )
                    // InternalQVTimperative.g:6332:6: otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}'
                    {
                    otherlv_13=(Token)match(input,35,FollowSets000.FOLLOW_118); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_13, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalQVTimperative.g:6336:1: ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )*
                    loop165:
                    do {
                        int alt165=3;
                        switch ( input.LA(1) ) {
                        case 67:
                            {
                            switch ( input.LA(2) ) {
                            case 68:
                                {
                                int LA165_6 = input.LA(3);

                                if ( (LA165_6==69||LA165_6==96) ) {
                                    alt165=2;
                                }
                                else if ( (LA165_6==93) ) {
                                    alt165=1;
                                }


                                }
                                break;
                            case 93:
                                {
                                alt165=1;
                                }
                                break;
                            case 69:
                            case 96:
                                {
                                alt165=2;
                                }
                                break;

                            }

                            }
                            break;
                        case 68:
                            {
                            switch ( input.LA(2) ) {
                            case 67:
                                {
                                int LA165_7 = input.LA(3);

                                if ( (LA165_7==93) ) {
                                    alt165=1;
                                }
                                else if ( (LA165_7==69||LA165_7==96) ) {
                                    alt165=2;
                                }


                                }
                                break;
                            case 93:
                                {
                                alt165=1;
                                }
                                break;
                            case 69:
                            case 96:
                                {
                                alt165=2;
                                }
                                break;

                            }

                            }
                            break;
                        case 93:
                            {
                            alt165=1;
                            }
                            break;
                        case 69:
                        case 96:
                            {
                            alt165=2;
                            }
                            break;

                        }

                        switch (alt165) {
                    	case 1 :
                    	    // InternalQVTimperative.g:6336:2: ( (lv_ownedOperations_14_0= ruleOperationCS ) )
                    	    {
                    	    // InternalQVTimperative.g:6336:2: ( (lv_ownedOperations_14_0= ruleOperationCS ) )
                    	    // InternalQVTimperative.g:6337:1: (lv_ownedOperations_14_0= ruleOperationCS )
                    	    {
                    	    // InternalQVTimperative.g:6337:1: (lv_ownedOperations_14_0= ruleOperationCS )
                    	    // InternalQVTimperative.g:6338:3: lv_ownedOperations_14_0= ruleOperationCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_118);
                    	    lv_ownedOperations_14_0=ruleOperationCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedOperations",
                    	              		lv_ownedOperations_14_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.OperationCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTimperative.g:6355:6: ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) )
                    	    {
                    	    // InternalQVTimperative.g:6355:6: ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) )
                    	    // InternalQVTimperative.g:6356:1: (lv_ownedProperties_15_0= ruleStructuralFeatureCS )
                    	    {
                    	    // InternalQVTimperative.g:6356:1: (lv_ownedProperties_15_0= ruleStructuralFeatureCS )
                    	    // InternalQVTimperative.g:6357:3: lv_ownedProperties_15_0= ruleStructuralFeatureCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_118);
                    	    lv_ownedProperties_15_0=ruleStructuralFeatureCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedProperties",
                    	              		lv_ownedProperties_15_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.StructuralFeatureCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_16, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6378:7: otherlv_17= ';'
                    {
                    otherlv_17=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_17, grammarAccess.getStructuredClassCSAccess().getSemicolonKeyword_7_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypedMultiplicityRefCS"
    // InternalQVTimperative.g:6392:1: entryRuleTypedMultiplicityRefCS returns [EObject current=null] : iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF ;
    public final EObject entryRuleTypedMultiplicityRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedMultiplicityRefCS = null;


        try {
            // InternalQVTimperative.g:6393:2: (iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF )
            // InternalQVTimperative.g:6394:2: iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedMultiplicityRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedMultiplicityRefCS=ruleTypedMultiplicityRefCS();

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

            }

        }

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


    // $ANTLR start "ruleTypedMultiplicityRefCS"
    // InternalQVTimperative.g:6401:1: ruleTypedMultiplicityRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypedMultiplicityRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypedRefCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6404:28: ( (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTimperative.g:6405:1: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTimperative.g:6405:1: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTimperative.g:6406:2: this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedRefCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_119);
            this_TypedRefCS_0=ruleTypedRefCS();

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

                      current = this_TypedRefCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalQVTimperative.g:6417:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==151) ) {
                alt167=1;
            }
            switch (alt167) {
                case 1 :
                    // InternalQVTimperative.g:6418:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTimperative.g:6418:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTimperative.g:6419:3: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypedMultiplicityRefCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedMultiplicity",
                              		lv_ownedMultiplicity_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypedRefCS"
    // InternalQVTimperative.g:6443:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
    public final EObject entryRuleTypedRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedRefCS = null;


        try {
            // InternalQVTimperative.g:6444:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
            // InternalQVTimperative.g:6445:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedRefCS=ruleTypedRefCS();

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

            }

        }

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


    // $ANTLR start "ruleTypedRefCS"
    // InternalQVTimperative.g:6452:1: ruleTypedRefCS returns [EObject current=null] : (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS ) ;
    public final EObject ruleTypedRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeLiteralCS_0 = null;

        EObject this_TypedTypeRefCS_1 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6455:28: ( (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS ) )
            // InternalQVTimperative.g:6456:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS )
            {
            // InternalQVTimperative.g:6456:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS )
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( ((LA168_0>=127 && LA168_0<=141)) ) {
                alt168=1;
            }
            else if ( ((LA168_0>=RULE_SIMPLE_ID && LA168_0<=RULE_ESCAPED_ID)||LA168_0==17||LA168_0==19||(LA168_0>=22 && LA168_0<=23)||(LA168_0>=25 && LA168_0<=26)||(LA168_0>=29 && LA168_0<=34)||LA168_0==39||(LA168_0>=43 && LA168_0<=48)||(LA168_0>=50 && LA168_0<=52)||(LA168_0>=54 && LA168_0<=55)||(LA168_0>=58 && LA168_0<=60)||(LA168_0>=62 && LA168_0<=70)||LA168_0==72||LA168_0==74||LA168_0==76||LA168_0==79||LA168_0==81||LA168_0==83||(LA168_0>=85 && LA168_0<=89)||(LA168_0>=91 && LA168_0<=96)||LA168_0==98||LA168_0==100||(LA168_0>=102 && LA168_0<=105)) ) {
                alt168=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 168, 0, input);

                throw nvae;
            }
            switch (alt168) {
                case 1 :
                    // InternalQVTimperative.g:6457:2: this_TypeLiteralCS_0= ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypedRefCSAccess().getTypeLiteralCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeLiteralCS_0=ruleTypeLiteralCS();

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

                              current = this_TypeLiteralCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6470:2: this_TypedTypeRefCS_1= ruleTypedTypeRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypedTypeRefCS_1=ruleTypedTypeRefCS();

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

                              current = this_TypedTypeRefCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleStructuralFeatureCS"
    // InternalQVTimperative.g:6489:1: entryRuleStructuralFeatureCS returns [EObject current=null] : iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF ;
    public final EObject entryRuleStructuralFeatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuralFeatureCS = null;


        try {
            // InternalQVTimperative.g:6490:2: (iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF )
            // InternalQVTimperative.g:6491:2: iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStructuralFeatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStructuralFeatureCS=ruleStructuralFeatureCS();

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

            }

        }

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


    // $ANTLR start "ruleStructuralFeatureCS"
    // InternalQVTimperative.g:6498:1: ruleStructuralFeatureCS returns [EObject current=null] : (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS ) ;
    public final EObject ruleStructuralFeatureCS() throws RecognitionException {
        EObject current = null;

        EObject this_AttributeCS_0 = null;

        EObject this_ReferenceCS_1 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6501:28: ( (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS ) )
            // InternalQVTimperative.g:6502:1: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            {
            // InternalQVTimperative.g:6502:1: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            int alt169=2;
            switch ( input.LA(1) ) {
            case 67:
                {
                switch ( input.LA(2) ) {
                case 68:
                    {
                    int LA169_5 = input.LA(3);

                    if ( (LA169_5==69) ) {
                        alt169=1;
                    }
                    else if ( (LA169_5==96) ) {
                        alt169=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 169, 5, input);

                        throw nvae;
                    }
                    }
                    break;
                case 69:
                    {
                    alt169=1;
                    }
                    break;
                case 96:
                    {
                    alt169=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 169, 1, input);

                    throw nvae;
                }

                }
                break;
            case 68:
                {
                switch ( input.LA(2) ) {
                case 67:
                    {
                    int LA169_6 = input.LA(3);

                    if ( (LA169_6==69) ) {
                        alt169=1;
                    }
                    else if ( (LA169_6==96) ) {
                        alt169=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 169, 6, input);

                        throw nvae;
                    }
                    }
                    break;
                case 69:
                    {
                    alt169=1;
                    }
                    break;
                case 96:
                    {
                    alt169=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 169, 2, input);

                    throw nvae;
                }

                }
                break;
            case 69:
                {
                alt169=1;
                }
                break;
            case 96:
                {
                alt169=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 169, 0, input);

                throw nvae;
            }

            switch (alt169) {
                case 1 :
                    // InternalQVTimperative.g:6503:2: this_AttributeCS_0= ruleAttributeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getStructuralFeatureCSAccess().getAttributeCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AttributeCS_0=ruleAttributeCS();

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

                              current = this_AttributeCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6516:2: this_ReferenceCS_1= ruleReferenceCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getStructuralFeatureCSAccess().getReferenceCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ReferenceCS_1=ruleReferenceCS();

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

                              current = this_ReferenceCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEnumerationLiteralName"
    // InternalQVTimperative.g:6535:1: entryRuleEnumerationLiteralName returns [String current=null] : iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF ;
    public final String entryRuleEnumerationLiteralName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEnumerationLiteralName = null;


        try {
            // InternalQVTimperative.g:6536:2: (iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF )
            // InternalQVTimperative.g:6537:2: iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationLiteralNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationLiteralName=ruleEnumerationLiteralName();

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

            }

        }

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


    // $ANTLR start "ruleEnumerationLiteralName"
    // InternalQVTimperative.g:6544:1: ruleEnumerationLiteralName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName ;
    public final AntlrDatatypeRuleToken ruleEnumerationLiteralName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnrestrictedName_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:6547:28: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName )
            // InternalQVTimperative.g:6549:5: this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getEnumerationLiteralNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnrestrictedName_0=ruleEssentialOCLUnrestrictedName();

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

              		current.merge(this_EssentialOCLUnrestrictedName_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleQVTbaseUnrestrictedName"
    // InternalQVTimperative.g:6567:1: entryRuleQVTbaseUnrestrictedName returns [String current=null] : iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF ;
    public final String entryRuleQVTbaseUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQVTbaseUnrestrictedName = null;


        try {
            // InternalQVTimperative.g:6568:2: (iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF )
            // InternalQVTimperative.g:6569:2: iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQVTbaseUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQVTbaseUnrestrictedName=ruleQVTbaseUnrestrictedName();

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

            }

        }

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


    // $ANTLR start "ruleQVTbaseUnrestrictedName"
    // InternalQVTimperative.g:6576:1: ruleQVTbaseUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) ;
    public final AntlrDatatypeRuleToken ruleQVTbaseUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:6579:28: ( (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) )
            // InternalQVTimperative.g:6580:1: (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            {
            // InternalQVTimperative.g:6580:1: (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            int alt170=28;
            switch ( input.LA(1) ) {
            case 102:
                {
                alt170=1;
                }
                break;
            case 69:
                {
                alt170=2;
                }
                break;
            case 95:
                {
                alt170=3;
                }
                break;
            case 103:
                {
                alt170=4;
                }
                break;
            case 98:
                {
                alt170=5;
                }
                break;
            case 88:
                {
                alt170=6;
                }
                break;
            case 68:
                {
                alt170=7;
                }
                break;
            case 70:
                {
                alt170=8;
                }
                break;
            case 86:
                {
                alt170=9;
                }
                break;
            case 91:
                {
                alt170=10;
                }
                break;
            case 104:
                {
                alt170=11;
                }
                break;
            case 72:
                {
                alt170=12;
                }
                break;
            case 85:
                {
                alt170=13;
                }
                break;
            case 105:
                {
                alt170=14;
                }
                break;
            case 92:
                {
                alt170=15;
                }
                break;
            case 93:
                {
                alt170=16;
                }
                break;
            case 74:
                {
                alt170=17;
                }
                break;
            case 87:
                {
                alt170=18;
                }
                break;
            case 96:
                {
                alt170=19;
                }
                break;
            case 76:
                {
                alt170=20;
                }
                break;
            case 100:
                {
                alt170=21;
                }
                break;
            case 89:
                {
                alt170=22;
                }
                break;
            case 67:
                {
                alt170=23;
                }
                break;
            case 94:
                {
                alt170=24;
                }
                break;
            case 54:
                {
                alt170=25;
                }
                break;
            case 79:
                {
                alt170=26;
                }
                break;
            case 81:
                {
                alt170=27;
                }
                break;
            case 83:
                {
                alt170=28;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 170, 0, input);

                throw nvae;
            }

            switch (alt170) {
                case 1 :
                    // InternalQVTimperative.g:6581:2: kw= 'abstract'
                    {
                    kw=(Token)match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getAbstractKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6588:2: kw= 'attribute'
                    {
                    kw=(Token)match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getAttributeKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:6595:2: kw= 'body'
                    {
                    kw=(Token)match(input,95,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getBodyKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:6602:2: kw= 'class'
                    {
                    kw=(Token)match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getClassKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:6609:2: kw= 'composes'
                    {
                    kw=(Token)match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getComposesKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:6616:2: kw= 'datatype'
                    {
                    kw=(Token)match(input,88,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDatatypeKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTimperative.g:6623:2: kw= 'definition'
                    {
                    kw=(Token)match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDefinitionKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTimperative.g:6630:2: kw= 'derived'
                    {
                    kw=(Token)match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDerivedKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTimperative.g:6637:2: kw= 'derivation'
                    {
                    kw=(Token)match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDerivationKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTimperative.g:6644:2: kw= 'enum'
                    {
                    kw=(Token)match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getEnumKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTimperative.g:6651:2: kw= 'extends'
                    {
                    kw=(Token)match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getExtendsKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTimperative.g:6658:2: kw= 'id'
                    {
                    kw=(Token)match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getIdKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTimperative.g:6665:2: kw= 'initial'
                    {
                    kw=(Token)match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getInitialKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTimperative.g:6672:2: kw= 'interface'
                    {
                    kw=(Token)match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getInterfaceKeyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTimperative.g:6679:2: kw= 'literal'
                    {
                    kw=(Token)match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getLiteralKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTimperative.g:6686:2: kw= 'operation'
                    {
                    kw=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getOperationKeyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTimperative.g:6693:2: kw= 'ordered'
                    {
                    kw=(Token)match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getOrderedKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTimperative.g:6700:2: kw= 'primitive'
                    {
                    kw=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getPrimitiveKeyword_17());

                    }

                    }
                    break;
                case 19 :
                    // InternalQVTimperative.g:6707:2: kw= 'property'
                    {
                    kw=(Token)match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getPropertyKeyword_18());

                    }

                    }
                    break;
                case 20 :
                    // InternalQVTimperative.g:6714:2: kw= 'readonly'
                    {
                    kw=(Token)match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getReadonlyKeyword_19());

                    }

                    }
                    break;
                case 21 :
                    // InternalQVTimperative.g:6721:2: kw= 'resolve'
                    {
                    kw=(Token)match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getResolveKeyword_20());

                    }

                    }
                    break;
                case 22 :
                    // InternalQVTimperative.g:6728:2: kw= 'serializable'
                    {
                    kw=(Token)match(input,89,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getSerializableKeyword_21());

                    }

                    }
                    break;
                case 23 :
                    // InternalQVTimperative.g:6735:2: kw= 'static'
                    {
                    kw=(Token)match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getStaticKeyword_22());

                    }

                    }
                    break;
                case 24 :
                    // InternalQVTimperative.g:6742:2: kw= 'throws'
                    {
                    kw=(Token)match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getThrowsKeyword_23());

                    }

                    }
                    break;
                case 25 :
                    // InternalQVTimperative.g:6749:2: kw= 'transient'
                    {
                    kw=(Token)match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getTransientKeyword_24());

                    }

                    }
                    break;
                case 26 :
                    // InternalQVTimperative.g:6756:2: kw= 'unique'
                    {
                    kw=(Token)match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getUniqueKeyword_25());

                    }

                    }
                    break;
                case 27 :
                    // InternalQVTimperative.g:6763:2: kw= 'unsettable'
                    {
                    kw=(Token)match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getUnsettableKeyword_26());

                    }

                    }
                    break;
                case 28 :
                    // InternalQVTimperative.g:6770:2: kw= 'volatile'
                    {
                    kw=(Token)match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getVolatileKeyword_27());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSIGNED"
    // InternalQVTimperative.g:6783:1: entryRuleSIGNED returns [String current=null] : iv_ruleSIGNED= ruleSIGNED EOF ;
    public final String entryRuleSIGNED() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSIGNED = null;


        try {
            // InternalQVTimperative.g:6784:2: (iv_ruleSIGNED= ruleSIGNED EOF )
            // InternalQVTimperative.g:6785:2: iv_ruleSIGNED= ruleSIGNED EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSIGNEDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSIGNED=ruleSIGNED();

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

            }

        }

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


    // $ANTLR start "ruleSIGNED"
    // InternalQVTimperative.g:6792:1: ruleSIGNED returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
    public final AntlrDatatypeRuleToken ruleSIGNED() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:6795:28: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
            // InternalQVTimperative.g:6796:1: ( (kw= '-' )? this_INT_1= RULE_INT )
            {
            // InternalQVTimperative.g:6796:1: ( (kw= '-' )? this_INT_1= RULE_INT )
            // InternalQVTimperative.g:6796:2: (kw= '-' )? this_INT_1= RULE_INT
            {
            // InternalQVTimperative.g:6796:2: (kw= '-' )?
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( (LA171_0==106) ) {
                alt171=1;
            }
            switch (alt171) {
                case 1 :
                    // InternalQVTimperative.g:6797:2: kw= '-'
                    {
                    kw=(Token)match(input,106,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());

                    }

                    }
                    break;

            }

            this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_INT_1);

            }
            if ( state.backtracking==0 ) {

                  newLeafNode(this_INT_1, grammarAccess.getSIGNEDAccess().getINTTerminalRuleCall_1());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEssentialOCLUnaryOperatorName"
    // InternalQVTimperative.g:6821:1: entryRuleEssentialOCLUnaryOperatorName returns [String current=null] : iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF ;
    public final String entryRuleEssentialOCLUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnaryOperatorName = null;


        try {
            // InternalQVTimperative.g:6822:2: (iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF )
            // InternalQVTimperative.g:6823:2: iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnaryOperatorName=ruleEssentialOCLUnaryOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleEssentialOCLUnaryOperatorName"
    // InternalQVTimperative.g:6830:1: ruleEssentialOCLUnaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '-' | kw= 'not' | kw= 'not2' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:6833:28: ( (kw= '-' | kw= 'not' | kw= 'not2' ) )
            // InternalQVTimperative.g:6834:1: (kw= '-' | kw= 'not' | kw= 'not2' )
            {
            // InternalQVTimperative.g:6834:1: (kw= '-' | kw= 'not' | kw= 'not2' )
            int alt172=3;
            switch ( input.LA(1) ) {
            case 106:
                {
                alt172=1;
                }
                break;
            case 107:
                {
                alt172=2;
                }
                break;
            case 108:
                {
                alt172=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 172, 0, input);

                throw nvae;
            }

            switch (alt172) {
                case 1 :
                    // InternalQVTimperative.g:6835:2: kw= '-'
                    {
                    kw=(Token)match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6842:2: kw= 'not'
                    {
                    kw=(Token)match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:6849:2: kw= 'not2'
                    {
                    kw=(Token)match(input,108,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEssentialOCLInfixOperatorName"
    // InternalQVTimperative.g:6862:1: entryRuleEssentialOCLInfixOperatorName returns [String current=null] : iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF ;
    public final String entryRuleEssentialOCLInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLInfixOperatorName = null;


        try {
            // InternalQVTimperative.g:6863:2: (iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF )
            // InternalQVTimperative.g:6864:2: iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLInfixOperatorName=ruleEssentialOCLInfixOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleEssentialOCLInfixOperatorName"
    // InternalQVTimperative.g:6871:1: ruleEssentialOCLInfixOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLInfixOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:6874:28: ( (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' ) )
            // InternalQVTimperative.g:6875:1: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' )
            {
            // InternalQVTimperative.g:6875:1: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' )
            int alt173=18;
            switch ( input.LA(1) ) {
            case 42:
                {
                alt173=1;
                }
                break;
            case 109:
                {
                alt173=2;
                }
                break;
            case 110:
                {
                alt173=3;
                }
                break;
            case 106:
                {
                alt173=4;
                }
                break;
            case 111:
                {
                alt173=5;
                }
                break;
            case 112:
                {
                alt173=6;
                }
                break;
            case 113:
                {
                alt173=7;
                }
                break;
            case 114:
                {
                alt173=8;
                }
                break;
            case 53:
                {
                alt173=9;
                }
                break;
            case 115:
                {
                alt173=10;
                }
                break;
            case 116:
                {
                alt173=11;
                }
                break;
            case 117:
                {
                alt173=12;
                }
                break;
            case 118:
                {
                alt173=13;
                }
                break;
            case 119:
                {
                alt173=14;
                }
                break;
            case 120:
                {
                alt173=15;
                }
                break;
            case 121:
                {
                alt173=16;
                }
                break;
            case 122:
                {
                alt173=17;
                }
                break;
            case 123:
                {
                alt173=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 173, 0, input);

                throw nvae;
            }

            switch (alt173) {
                case 1 :
                    // InternalQVTimperative.g:6876:2: kw= '*'
                    {
                    kw=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:6883:2: kw= '/'
                    {
                    kw=(Token)match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:6890:2: kw= '+'
                    {
                    kw=(Token)match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:6897:2: kw= '-'
                    {
                    kw=(Token)match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:6904:2: kw= '>'
                    {
                    kw=(Token)match(input,111,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:6911:2: kw= '<'
                    {
                    kw=(Token)match(input,112,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTimperative.g:6918:2: kw= '>='
                    {
                    kw=(Token)match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTimperative.g:6925:2: kw= '<='
                    {
                    kw=(Token)match(input,114,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTimperative.g:6932:2: kw= '='
                    {
                    kw=(Token)match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTimperative.g:6939:2: kw= '<>'
                    {
                    kw=(Token)match(input,115,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTimperative.g:6946:2: kw= 'and'
                    {
                    kw=(Token)match(input,116,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTimperative.g:6953:2: kw= 'and2'
                    {
                    kw=(Token)match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTimperative.g:6960:2: kw= 'implies'
                    {
                    kw=(Token)match(input,118,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTimperative.g:6967:2: kw= 'implies2'
                    {
                    kw=(Token)match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTimperative.g:6974:2: kw= 'or'
                    {
                    kw=(Token)match(input,120,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTimperative.g:6981:2: kw= 'or2'
                    {
                    kw=(Token)match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTimperative.g:6988:2: kw= 'xor'
                    {
                    kw=(Token)match(input,122,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTimperative.g:6995:2: kw= 'xor2'
                    {
                    kw=(Token)match(input,123,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEssentialOCLNavigationOperatorName"
    // InternalQVTimperative.g:7008:1: entryRuleEssentialOCLNavigationOperatorName returns [String current=null] : iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF ;
    public final String entryRuleEssentialOCLNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLNavigationOperatorName = null;


        try {
            // InternalQVTimperative.g:7009:2: (iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF )
            // InternalQVTimperative.g:7010:2: iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLNavigationOperatorName=ruleEssentialOCLNavigationOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleEssentialOCLNavigationOperatorName"
    // InternalQVTimperative.g:7017:1: ruleEssentialOCLNavigationOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLNavigationOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:7020:28: ( (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' ) )
            // InternalQVTimperative.g:7021:1: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            {
            // InternalQVTimperative.g:7021:1: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            int alt174=4;
            switch ( input.LA(1) ) {
            case 61:
                {
                alt174=1;
                }
                break;
            case 124:
                {
                alt174=2;
                }
                break;
            case 125:
                {
                alt174=3;
                }
                break;
            case 126:
                {
                alt174=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 174, 0, input);

                throw nvae;
            }

            switch (alt174) {
                case 1 :
                    // InternalQVTimperative.g:7022:2: kw= '.'
                    {
                    kw=(Token)match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7029:2: kw= '->'
                    {
                    kw=(Token)match(input,124,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:7036:2: kw= '?.'
                    {
                    kw=(Token)match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:7043:2: kw= '?->'
                    {
                    kw=(Token)match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleBinaryOperatorName"
    // InternalQVTimperative.g:7056:1: entryRuleBinaryOperatorName returns [String current=null] : iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF ;
    public final String entryRuleBinaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleBinaryOperatorName = null;


        try {
            // InternalQVTimperative.g:7057:2: (iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF )
            // InternalQVTimperative.g:7058:2: iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBinaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBinaryOperatorName=ruleBinaryOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleBinaryOperatorName"
    // InternalQVTimperative.g:7065:1: ruleBinaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName ) ;
    public final AntlrDatatypeRuleToken ruleBinaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_InfixOperatorName_0 = null;

        AntlrDatatypeRuleToken this_NavigationOperatorName_1 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7068:28: ( (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName ) )
            // InternalQVTimperative.g:7069:1: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            {
            // InternalQVTimperative.g:7069:1: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==42||LA175_0==53||LA175_0==106||(LA175_0>=109 && LA175_0<=123)) ) {
                alt175=1;
            }
            else if ( (LA175_0==61||(LA175_0>=124 && LA175_0<=126)) ) {
                alt175=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 175, 0, input);

                throw nvae;
            }
            switch (alt175) {
                case 1 :
                    // InternalQVTimperative.g:7070:5: this_InfixOperatorName_0= ruleInfixOperatorName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InfixOperatorName_0=ruleInfixOperatorName();

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

                      		current.merge(this_InfixOperatorName_0);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7082:5: this_NavigationOperatorName_1= ruleNavigationOperatorName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NavigationOperatorName_1=ruleNavigationOperatorName();

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

                      		current.merge(this_NavigationOperatorName_1);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleInfixOperatorName"
    // InternalQVTimperative.g:7100:1: entryRuleInfixOperatorName returns [String current=null] : iv_ruleInfixOperatorName= ruleInfixOperatorName EOF ;
    public final String entryRuleInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleInfixOperatorName = null;


        try {
            // InternalQVTimperative.g:7101:2: (iv_ruleInfixOperatorName= ruleInfixOperatorName EOF )
            // InternalQVTimperative.g:7102:2: iv_ruleInfixOperatorName= ruleInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInfixOperatorName=ruleInfixOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleInfixOperatorName"
    // InternalQVTimperative.g:7109:1: ruleInfixOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName ;
    public final AntlrDatatypeRuleToken ruleInfixOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLInfixOperatorName_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7112:28: (this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName )
            // InternalQVTimperative.g:7114:5: this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getInfixOperatorNameAccess().getEssentialOCLInfixOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLInfixOperatorName_0=ruleEssentialOCLInfixOperatorName();

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

              		current.merge(this_EssentialOCLInfixOperatorName_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigationOperatorName"
    // InternalQVTimperative.g:7132:1: entryRuleNavigationOperatorName returns [String current=null] : iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF ;
    public final String entryRuleNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNavigationOperatorName = null;


        try {
            // InternalQVTimperative.g:7133:2: (iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF )
            // InternalQVTimperative.g:7134:2: iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigationOperatorName=ruleNavigationOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleNavigationOperatorName"
    // InternalQVTimperative.g:7141:1: ruleNavigationOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName ;
    public final AntlrDatatypeRuleToken ruleNavigationOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLNavigationOperatorName_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7144:28: (this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName )
            // InternalQVTimperative.g:7146:5: this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getNavigationOperatorNameAccess().getEssentialOCLNavigationOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLNavigationOperatorName_0=ruleEssentialOCLNavigationOperatorName();

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

              		current.merge(this_EssentialOCLNavigationOperatorName_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleUnaryOperatorName"
    // InternalQVTimperative.g:7164:1: entryRuleUnaryOperatorName returns [String current=null] : iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF ;
    public final String entryRuleUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnaryOperatorName = null;


        try {
            // InternalQVTimperative.g:7165:2: (iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF )
            // InternalQVTimperative.g:7166:2: iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnaryOperatorName=ruleUnaryOperatorName();

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

            }

        }

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


    // $ANTLR start "ruleUnaryOperatorName"
    // InternalQVTimperative.g:7173:1: ruleUnaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName ;
    public final AntlrDatatypeRuleToken ruleUnaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnaryOperatorName_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7176:28: (this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName )
            // InternalQVTimperative.g:7178:5: this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getUnaryOperatorNameAccess().getEssentialOCLUnaryOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnaryOperatorName_0=ruleEssentialOCLUnaryOperatorName();

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

              		current.merge(this_EssentialOCLUnaryOperatorName_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEssentialOCLUnrestrictedName"
    // InternalQVTimperative.g:7196:1: entryRuleEssentialOCLUnrestrictedName returns [String current=null] : iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF ;
    public final String entryRuleEssentialOCLUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnrestrictedName = null;


        try {
            // InternalQVTimperative.g:7197:2: (iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF )
            // InternalQVTimperative.g:7198:2: iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnrestrictedName=ruleEssentialOCLUnrestrictedName();

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

            }

        }

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


    // $ANTLR start "ruleEssentialOCLUnrestrictedName"
    // InternalQVTimperative.g:7205:1: ruleEssentialOCLUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_Identifier_0= ruleIdentifier ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_Identifier_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7208:28: (this_Identifier_0= ruleIdentifier )
            // InternalQVTimperative.g:7210:5: this_Identifier_0= ruleIdentifier
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getEssentialOCLUnrestrictedNameAccess().getIdentifierParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_Identifier_0=ruleIdentifier();

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

              		current.merge(this_Identifier_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleEssentialOCLUnreservedName"
    // InternalQVTimperative.g:7228:1: entryRuleEssentialOCLUnreservedName returns [String current=null] : iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF ;
    public final String entryRuleEssentialOCLUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnreservedName = null;


        try {
            // InternalQVTimperative.g:7229:2: (iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF )
            // InternalQVTimperative.g:7230:2: iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnreservedName=ruleEssentialOCLUnreservedName();

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

            }

        }

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


    // $ANTLR start "ruleEssentialOCLUnreservedName"
    // InternalQVTimperative.g:7237:1: ruleEssentialOCLUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnreservedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_UnrestrictedName_0 = null;

        AntlrDatatypeRuleToken this_CollectionTypeIdentifier_1 = null;

        AntlrDatatypeRuleToken this_PrimitiveTypeIdentifier_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7240:28: ( (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' ) )
            // InternalQVTimperative.g:7241:1: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            {
            // InternalQVTimperative.g:7241:1: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            int alt176=5;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 19:
            case 22:
            case 23:
            case 25:
            case 26:
            case 29:
            case 30:
            case 31:
            case 32:
            case 33:
            case 34:
            case 39:
            case 43:
            case 44:
            case 45:
            case 46:
            case 47:
            case 48:
            case 50:
            case 51:
            case 52:
            case 54:
            case 55:
            case 58:
            case 59:
            case 60:
            case 62:
            case 63:
            case 64:
            case 65:
            case 66:
            case 67:
            case 68:
            case 69:
            case 70:
            case 72:
            case 74:
            case 76:
            case 79:
            case 81:
            case 83:
            case 85:
            case 86:
            case 87:
            case 88:
            case 89:
            case 91:
            case 92:
            case 93:
            case 94:
            case 95:
            case 96:
            case 98:
            case 100:
            case 102:
            case 103:
            case 104:
            case 105:
                {
                alt176=1;
                }
                break;
            case 137:
            case 138:
            case 139:
            case 140:
            case 141:
                {
                alt176=2;
                }
                break;
            case 129:
            case 130:
            case 131:
            case 132:
            case 133:
            case 134:
            case 135:
            case 136:
                {
                alt176=3;
                }
                break;
            case 127:
                {
                alt176=4;
                }
                break;
            case 128:
                {
                alt176=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 176, 0, input);

                throw nvae;
            }

            switch (alt176) {
                case 1 :
                    // InternalQVTimperative.g:7242:5: this_UnrestrictedName_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_UnrestrictedName_0=ruleUnrestrictedName();

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

                      		current.merge(this_UnrestrictedName_0);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7254:5: this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionTypeIdentifier_1=ruleCollectionTypeIdentifier();

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

                      		current.merge(this_CollectionTypeIdentifier_1);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:7266:5: this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveTypeIdentifier_2=rulePrimitiveTypeIdentifier();

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

                      		current.merge(this_PrimitiveTypeIdentifier_2);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:7278:2: kw= 'Map'
                    {
                    kw=(Token)match(input,127,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:7285:2: kw= 'Tuple'
                    {
                    kw=(Token)match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleUnreservedName"
    // InternalQVTimperative.g:7298:1: entryRuleUnreservedName returns [String current=null] : iv_ruleUnreservedName= ruleUnreservedName EOF ;
    public final String entryRuleUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnreservedName = null;


        try {
            // InternalQVTimperative.g:7299:2: (iv_ruleUnreservedName= ruleUnreservedName EOF )
            // InternalQVTimperative.g:7300:2: iv_ruleUnreservedName= ruleUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnreservedName=ruleUnreservedName();

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

            }

        }

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


    // $ANTLR start "ruleUnreservedName"
    // InternalQVTimperative.g:7307:1: ruleUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName ;
    public final AntlrDatatypeRuleToken ruleUnreservedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnreservedName_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7310:28: (this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName )
            // InternalQVTimperative.g:7312:5: this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getUnreservedNameAccess().getEssentialOCLUnreservedNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnreservedName_0=ruleEssentialOCLUnreservedName();

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

              		current.merge(this_EssentialOCLUnreservedName_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleURIPathNameCS"
    // InternalQVTimperative.g:7330:1: entryRuleURIPathNameCS returns [EObject current=null] : iv_ruleURIPathNameCS= ruleURIPathNameCS EOF ;
    public final EObject entryRuleURIPathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIPathNameCS = null;


        try {
            // InternalQVTimperative.g:7331:2: (iv_ruleURIPathNameCS= ruleURIPathNameCS EOF )
            // InternalQVTimperative.g:7332:2: iv_ruleURIPathNameCS= ruleURIPathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURIPathNameCS=ruleURIPathNameCS();

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

            }

        }

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


    // $ANTLR start "ruleURIPathNameCS"
    // InternalQVTimperative.g:7339:1: ruleURIPathNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) ;
    public final EObject ruleURIPathNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7342:28: ( ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalQVTimperative.g:7343:1: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalQVTimperative.g:7343:1: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalQVTimperative.g:7343:2: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalQVTimperative.g:7343:2: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) )
            // InternalQVTimperative.g:7344:1: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            {
            // InternalQVTimperative.g:7344:1: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            // InternalQVTimperative.g:7345:3: lv_ownedPathElements_0_0= ruleURIFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_120);
            lv_ownedPathElements_0_0=ruleURIFirstPathElementCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getURIPathNameCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedPathElements",
                      		lv_ownedPathElements_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.URIFirstPathElementCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:7361:2: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop177:
            do {
                int alt177=2;
                int LA177_0 = input.LA(1);

                if ( (LA177_0==41) ) {
                    int LA177_1 = input.LA(2);

                    if ( ((LA177_1>=RULE_SIMPLE_ID && LA177_1<=RULE_ESCAPED_ID)||LA177_1==17||LA177_1==19||(LA177_1>=22 && LA177_1<=23)||(LA177_1>=25 && LA177_1<=26)||(LA177_1>=29 && LA177_1<=34)||LA177_1==39||(LA177_1>=43 && LA177_1<=48)||(LA177_1>=50 && LA177_1<=52)||(LA177_1>=54 && LA177_1<=55)||(LA177_1>=58 && LA177_1<=60)||(LA177_1>=62 && LA177_1<=70)||LA177_1==72||LA177_1==74||LA177_1==76||LA177_1==79||LA177_1==81||LA177_1==83||(LA177_1>=85 && LA177_1<=89)||(LA177_1>=91 && LA177_1<=96)||LA177_1==98||LA177_1==100||(LA177_1>=102 && LA177_1<=105)||(LA177_1>=127 && LA177_1<=141)) ) {
                        alt177=1;
                    }


                }


                switch (alt177) {
            	case 1 :
            	    // InternalQVTimperative.g:7361:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_12); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalQVTimperative.g:7365:1: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTimperative.g:7366:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTimperative.g:7366:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTimperative.g:7367:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_120);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getURIPathNameCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedPathElements",
            	              		lv_ownedPathElements_2_0,
            	              		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleURIFirstPathElementCS"
    // InternalQVTimperative.g:7391:1: entryRuleURIFirstPathElementCS returns [EObject current=null] : iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF ;
    public final EObject entryRuleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIFirstPathElementCS = null;


        try {
            // InternalQVTimperative.g:7392:2: (iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF )
            // InternalQVTimperative.g:7393:2: iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURIFirstPathElementCS=ruleURIFirstPathElementCS();

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

            }

        }

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


    // $ANTLR start "ruleURIFirstPathElementCS"
    // InternalQVTimperative.g:7400:1: ruleURIFirstPathElementCS returns [EObject current=null] : ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) ;
    public final EObject ruleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalQVTimperative.g:7403:28: ( ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) )
            // InternalQVTimperative.g:7404:1: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            {
            // InternalQVTimperative.g:7404:1: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            int alt178=2;
            int LA178_0 = input.LA(1);

            if ( ((LA178_0>=RULE_SIMPLE_ID && LA178_0<=RULE_ESCAPED_ID)||LA178_0==17||LA178_0==19||(LA178_0>=22 && LA178_0<=23)||(LA178_0>=25 && LA178_0<=26)||(LA178_0>=29 && LA178_0<=34)||LA178_0==39||(LA178_0>=43 && LA178_0<=48)||(LA178_0>=50 && LA178_0<=52)||(LA178_0>=54 && LA178_0<=55)||(LA178_0>=58 && LA178_0<=60)||(LA178_0>=62 && LA178_0<=70)||LA178_0==72||LA178_0==74||LA178_0==76||LA178_0==79||LA178_0==81||LA178_0==83||(LA178_0>=85 && LA178_0<=89)||(LA178_0>=91 && LA178_0<=96)||LA178_0==98||LA178_0==100||(LA178_0>=102 && LA178_0<=105)) ) {
                alt178=1;
            }
            else if ( (LA178_0==RULE_SINGLE_QUOTED_STRING) ) {
                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 :
                    // InternalQVTimperative.g:7404:2: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalQVTimperative.g:7404:2: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:7405:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:7405:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:7406:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getURIFirstPathElementCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7423:6: ( () ( ( ruleURI ) ) )
                    {
                    // InternalQVTimperative.g:7423:6: ( () ( ( ruleURI ) ) )
                    // InternalQVTimperative.g:7423:7: () ( ( ruleURI ) )
                    {
                    // InternalQVTimperative.g:7423:7: ()
                    // InternalQVTimperative.g:7424:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0(),
                                  current);

                    }

                    }

                    // InternalQVTimperative.g:7432:2: ( ( ruleURI ) )
                    // InternalQVTimperative.g:7433:1: ( ruleURI )
                    {
                    // InternalQVTimperative.g:7433:1: ( ruleURI )
                    // InternalQVTimperative.g:7434:3: ruleURI
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getURIFirstPathElementCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleURI();

                    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 "ruleURIFirstPathElementCS"


    // $ANTLR start "entryRulePrimitiveTypeIdentifier"
    // InternalQVTimperative.g:7460:1: entryRulePrimitiveTypeIdentifier returns [String current=null] : iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF ;
    public final String entryRulePrimitiveTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_rulePrimitiveTypeIdentifier = null;


        try {
            // InternalQVTimperative.g:7461:2: (iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF )
            // InternalQVTimperative.g:7462:2: iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeIdentifier=rulePrimitiveTypeIdentifier();

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

            }

        }

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


    // $ANTLR start "rulePrimitiveTypeIdentifier"
    // InternalQVTimperative.g:7469:1: rulePrimitiveTypeIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' ) ;
    public final AntlrDatatypeRuleToken rulePrimitiveTypeIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:7472:28: ( (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' ) )
            // InternalQVTimperative.g:7473:1: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            {
            // InternalQVTimperative.g:7473:1: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            int alt179=8;
            switch ( input.LA(1) ) {
            case 129:
                {
                alt179=1;
                }
                break;
            case 130:
                {
                alt179=2;
                }
                break;
            case 131:
                {
                alt179=3;
                }
                break;
            case 132:
                {
                alt179=4;
                }
                break;
            case 133:
                {
                alt179=5;
                }
                break;
            case 134:
                {
                alt179=6;
                }
                break;
            case 135:
                {
                alt179=7;
                }
                break;
            case 136:
                {
                alt179=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 179, 0, input);

                throw nvae;
            }

            switch (alt179) {
                case 1 :
                    // InternalQVTimperative.g:7474:2: kw= 'Boolean'
                    {
                    kw=(Token)match(input,129,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7481:2: kw= 'Integer'
                    {
                    kw=(Token)match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:7488:2: kw= 'Real'
                    {
                    kw=(Token)match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:7495:2: kw= 'String'
                    {
                    kw=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:7502:2: kw= 'UnlimitedNatural'
                    {
                    kw=(Token)match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:7509:2: kw= 'OclAny'
                    {
                    kw=(Token)match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTimperative.g:7516:2: kw= 'OclInvalid'
                    {
                    kw=(Token)match(input,135,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTimperative.g:7523:2: kw= 'OclVoid'
                    {
                    kw=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePrimitiveTypeCS"
    // InternalQVTimperative.g:7536:1: entryRulePrimitiveTypeCS returns [EObject current=null] : iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF ;
    public final EObject entryRulePrimitiveTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveTypeCS = null;


        try {
            // InternalQVTimperative.g:7537:2: (iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF )
            // InternalQVTimperative.g:7538:2: iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeCS=rulePrimitiveTypeCS();

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

            }

        }

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


    // $ANTLR start "rulePrimitiveTypeCS"
    // InternalQVTimperative.g:7545:1: rulePrimitiveTypeCS returns [EObject current=null] : ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) ) ;
    public final EObject rulePrimitiveTypeCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7548:28: ( ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) ) )
            // InternalQVTimperative.g:7549:1: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            {
            // InternalQVTimperative.g:7549:1: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            // InternalQVTimperative.g:7550:1: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            {
            // InternalQVTimperative.g:7550:1: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            // InternalQVTimperative.g:7551:3: lv_name_0_0= rulePrimitiveTypeIdentifier
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_name_0_0=rulePrimitiveTypeIdentifier();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPrimitiveTypeCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrimitiveTypeIdentifier");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCollectionTypeIdentifier"
    // InternalQVTimperative.g:7575:1: entryRuleCollectionTypeIdentifier returns [String current=null] : iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF ;
    public final String entryRuleCollectionTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleCollectionTypeIdentifier = null;


        try {
            // InternalQVTimperative.g:7576:2: (iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF )
            // InternalQVTimperative.g:7577:2: iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionTypeIdentifier=ruleCollectionTypeIdentifier();

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

            }

        }

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


    // $ANTLR start "ruleCollectionTypeIdentifier"
    // InternalQVTimperative.g:7584:1: ruleCollectionTypeIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' ) ;
    public final AntlrDatatypeRuleToken ruleCollectionTypeIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:7587:28: ( (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' ) )
            // InternalQVTimperative.g:7588:1: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            {
            // InternalQVTimperative.g:7588:1: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            int alt180=5;
            switch ( input.LA(1) ) {
            case 137:
                {
                alt180=1;
                }
                break;
            case 138:
                {
                alt180=2;
                }
                break;
            case 139:
                {
                alt180=3;
                }
                break;
            case 140:
                {
                alt180=4;
                }
                break;
            case 141:
                {
                alt180=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 180, 0, input);

                throw nvae;
            }

            switch (alt180) {
                case 1 :
                    // InternalQVTimperative.g:7589:2: kw= 'Set'
                    {
                    kw=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:7596:2: kw= 'Bag'
                    {
                    kw=(Token)match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:7603:2: kw= 'Sequence'
                    {
                    kw=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:7610:2: kw= 'Collection'
                    {
                    kw=(Token)match(input,140,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:7617:2: kw= 'OrderedSet'
                    {
                    kw=(Token)match(input,141,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCollectionTypeCS"
    // InternalQVTimperative.g:7630:1: entryRuleCollectionTypeCS returns [EObject current=null] : iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF ;
    public final EObject entryRuleCollectionTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionTypeCS = null;


        try {
            // InternalQVTimperative.g:7631:2: (iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF )
            // InternalQVTimperative.g:7632:2: iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionTypeCS=ruleCollectionTypeCS();

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

            }

        }

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


    // $ANTLR start "ruleCollectionTypeCS"
    // InternalQVTimperative.g:7639:1: ruleCollectionTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? ) ;
    public final EObject ruleCollectionTypeCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedCollectionMultiplicity_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7642:28: ( ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? ) )
            // InternalQVTimperative.g:7643:1: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            {
            // InternalQVTimperative.g:7643:1: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            // InternalQVTimperative.g:7643:2: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            {
            // InternalQVTimperative.g:7643:2: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) )
            // InternalQVTimperative.g:7644:1: (lv_name_0_0= ruleCollectionTypeIdentifier )
            {
            // InternalQVTimperative.g:7644:1: (lv_name_0_0= ruleCollectionTypeIdentifier )
            // InternalQVTimperative.g:7645:3: lv_name_0_0= ruleCollectionTypeIdentifier
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_121);
            lv_name_0_0=ruleCollectionTypeIdentifier();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeIdentifier");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:7661:2: (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            int alt182=2;
            int LA182_0 = input.LA(1);

            if ( (LA182_0==56) ) {
                alt182=1;
            }
            switch (alt182) {
                case 1 :
                    // InternalQVTimperative.g:7661:4: otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')'
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTimperative.g:7665:1: ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) )
                    // InternalQVTimperative.g:7666:1: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    {
                    // InternalQVTimperative.g:7666:1: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    // InternalQVTimperative.g:7667:3: lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_122);
                    lv_ownedType_2_0=ruleTypeExpWithoutMultiplicityCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpWithoutMultiplicityCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:7683:2: ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )?
                    int alt181=2;
                    int LA181_0 = input.LA(1);

                    if ( (LA181_0==151) ) {
                        alt181=1;
                    }
                    switch (alt181) {
                        case 1 :
                            // InternalQVTimperative.g:7684:1: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            {
                            // InternalQVTimperative.g:7684:1: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            // InternalQVTimperative.g:7685:3: lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_123);
                            lv_ownedCollectionMultiplicity_3_0=ruleMultiplicityCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedCollectionMultiplicity",
                                      		lv_ownedCollectionMultiplicity_3_0,
                                      		"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMapTypeCS"
    // InternalQVTimperative.g:7713:1: entryRuleMapTypeCS returns [EObject current=null] : iv_ruleMapTypeCS= ruleMapTypeCS EOF ;
    public final EObject entryRuleMapTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapTypeCS = null;


        try {
            // InternalQVTimperative.g:7714:2: (iv_ruleMapTypeCS= ruleMapTypeCS EOF )
            // InternalQVTimperative.g:7715:2: iv_ruleMapTypeCS= ruleMapTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapTypeCS=ruleMapTypeCS();

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

            }

        }

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


    // $ANTLR start "ruleMapTypeCS"
    // InternalQVTimperative.g:7722:1: ruleMapTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? ) ;
    public final EObject ruleMapTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedKeyType_2_0 = null;

        EObject lv_ownedValueType_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7725:28: ( ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? ) )
            // InternalQVTimperative.g:7726:1: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            {
            // InternalQVTimperative.g:7726:1: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            // InternalQVTimperative.g:7726:2: ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            {
            // InternalQVTimperative.g:7726:2: ( (lv_name_0_0= 'Map' ) )
            // InternalQVTimperative.g:7727:1: (lv_name_0_0= 'Map' )
            {
            // InternalQVTimperative.g:7727:1: (lv_name_0_0= 'Map' )
            // InternalQVTimperative.g:7728:3: lv_name_0_0= 'Map'
            {
            lv_name_0_0=(Token)match(input,127,FollowSets000.FOLLOW_121); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_name_0_0, grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getMapTypeCSRule());
              	        }
                     		setWithLastConsumed(current, "name", lv_name_0_0, "Map");

            }

            }


            }

            // InternalQVTimperative.g:7741:2: (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( (LA183_0==56) ) {
                alt183=1;
            }
            switch (alt183) {
                case 1 :
                    // InternalQVTimperative.g:7741:4: otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTimperative.g:7745:1: ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:7746:1: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:7746:1: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:7747:3: lv_ownedKeyType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_124);
                    lv_ownedKeyType_2_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMapTypeCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedKeyType",
                              		lv_ownedKeyType_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_3, grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());

                    }
                    // InternalQVTimperative.g:7767:1: ( (lv_ownedValueType_4_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:7768:1: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:7768:1: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:7769:3: lv_ownedValueType_4_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_123);
                    lv_ownedValueType_4_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMapTypeCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedValueType",
                              		lv_ownedValueType_4_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_5, grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTupleTypeCS"
    // InternalQVTimperative.g:7797:1: entryRuleTupleTypeCS returns [EObject current=null] : iv_ruleTupleTypeCS= ruleTupleTypeCS EOF ;
    public final EObject entryRuleTupleTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleTypeCS = null;


        try {
            // InternalQVTimperative.g:7798:2: (iv_ruleTupleTypeCS= ruleTupleTypeCS EOF )
            // InternalQVTimperative.g:7799:2: iv_ruleTupleTypeCS= ruleTupleTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleTypeCS=ruleTupleTypeCS();

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

            }

        }

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


    // $ANTLR start "ruleTupleTypeCS"
    // InternalQVTimperative.g:7806:1: ruleTupleTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? ) ;
    public final EObject ruleTupleTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7809:28: ( ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? ) )
            // InternalQVTimperative.g:7810:1: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            {
            // InternalQVTimperative.g:7810:1: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            // InternalQVTimperative.g:7810:2: ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            {
            // InternalQVTimperative.g:7810:2: ( (lv_name_0_0= 'Tuple' ) )
            // InternalQVTimperative.g:7811:1: (lv_name_0_0= 'Tuple' )
            {
            // InternalQVTimperative.g:7811:1: (lv_name_0_0= 'Tuple' )
            // InternalQVTimperative.g:7812:3: lv_name_0_0= 'Tuple'
            {
            lv_name_0_0=(Token)match(input,128,FollowSets000.FOLLOW_121); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_name_0_0, grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getTupleTypeCSRule());
              	        }
                     		setWithLastConsumed(current, "name", lv_name_0_0, "Tuple");

            }

            }


            }

            // InternalQVTimperative.g:7825:2: (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            int alt186=2;
            int LA186_0 = input.LA(1);

            if ( (LA186_0==56) ) {
                alt186=1;
            }
            switch (alt186) {
                case 1 :
                    // InternalQVTimperative.g:7825:4: otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTimperative.g:7829:1: ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )?
                    int alt185=2;
                    int LA185_0 = input.LA(1);

                    if ( ((LA185_0>=RULE_SIMPLE_ID && LA185_0<=RULE_ESCAPED_ID)||LA185_0==17||LA185_0==19||(LA185_0>=22 && LA185_0<=23)||(LA185_0>=25 && LA185_0<=26)||(LA185_0>=29 && LA185_0<=34)||LA185_0==39||(LA185_0>=43 && LA185_0<=48)||(LA185_0>=50 && LA185_0<=52)||(LA185_0>=54 && LA185_0<=55)||(LA185_0>=58 && LA185_0<=60)||(LA185_0>=62 && LA185_0<=70)||LA185_0==72||LA185_0==74||LA185_0==76||LA185_0==79||LA185_0==81||LA185_0==83||(LA185_0>=85 && LA185_0<=89)||(LA185_0>=91 && LA185_0<=96)||LA185_0==98||LA185_0==100||(LA185_0>=102 && LA185_0<=105)) ) {
                        alt185=1;
                    }
                    switch (alt185) {
                        case 1 :
                            // InternalQVTimperative.g:7829:2: ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            {
                            // InternalQVTimperative.g:7829:2: ( (lv_ownedParts_2_0= ruleTuplePartCS ) )
                            // InternalQVTimperative.g:7830:1: (lv_ownedParts_2_0= ruleTuplePartCS )
                            {
                            // InternalQVTimperative.g:7830:1: (lv_ownedParts_2_0= ruleTuplePartCS )
                            // InternalQVTimperative.g:7831:3: lv_ownedParts_2_0= ruleTuplePartCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_56);
                            lv_ownedParts_2_0=ruleTuplePartCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getTupleTypeCSRule());
                              	        }
                                     		add(
                                     			current,
                                     			"ownedParts",
                                      		lv_ownedParts_2_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TuplePartCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTimperative.g:7847:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            loop184:
                            do {
                                int alt184=2;
                                int LA184_0 = input.LA(1);

                                if ( (LA184_0==18) ) {
                                    alt184=1;
                                }


                                switch (alt184) {
                            	case 1 :
                            	    // InternalQVTimperative.g:7847:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    {
                            	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	          	newLeafNode(otherlv_3, grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());

                            	    }
                            	    // InternalQVTimperative.g:7851:1: ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    // InternalQVTimperative.g:7852:1: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    {
                            	    // InternalQVTimperative.g:7852:1: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    // InternalQVTimperative.g:7853:3: lv_ownedParts_4_0= ruleTuplePartCS
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());

                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_56);
                            	    lv_ownedParts_4_0=ruleTuplePartCS();

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

                            	      	        if (current==null) {
                            	      	            current = createModelElementForParent(grammarAccess.getTupleTypeCSRule());
                            	      	        }
                            	             		add(
                            	             			current,
                            	             			"ownedParts",
                            	              		lv_ownedParts_4_0,
                            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TuplePartCS");
                            	      	        afterParserOrEnumRuleCall();

                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_5, grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTuplePartCS"
    // InternalQVTimperative.g:7881:1: entryRuleTuplePartCS returns [EObject current=null] : iv_ruleTuplePartCS= ruleTuplePartCS EOF ;
    public final EObject entryRuleTuplePartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTuplePartCS = null;


        try {
            // InternalQVTimperative.g:7882:2: (iv_ruleTuplePartCS= ruleTuplePartCS EOF )
            // InternalQVTimperative.g:7883:2: iv_ruleTuplePartCS= ruleTuplePartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTuplePartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTuplePartCS=ruleTuplePartCS();

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

            }

        }

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


    // $ANTLR start "ruleTuplePartCS"
    // InternalQVTimperative.g:7890:1: ruleTuplePartCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject ruleTuplePartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7893:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTimperative.g:7894:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTimperative.g:7894:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTimperative.g:7894:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTimperative.g:7894:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:7895:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:7895:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:7896:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTuplePartCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getTuplePartCSAccess().getColonKeyword_1());

            }
            // InternalQVTimperative.g:7916:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:7917:1: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:7917:1: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalQVTimperative.g:7918:3: lv_ownedType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_2_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTuplePartCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCollectionLiteralExpCS"
    // InternalQVTimperative.g:7942:1: entryRuleCollectionLiteralExpCS returns [EObject current=null] : iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF ;
    public final EObject entryRuleCollectionLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:7943:2: (iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF )
            // InternalQVTimperative.g:7944:2: iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionLiteralExpCS=ruleCollectionLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleCollectionLiteralExpCS"
    // InternalQVTimperative.g:7951:1: ruleCollectionLiteralExpCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleCollectionLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:7954:28: ( ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTimperative.g:7955:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTimperative.g:7955:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTimperative.g:7955:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTimperative.g:7955:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalQVTimperative.g:7956:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalQVTimperative.g:7956:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalQVTimperative.g:7957:3: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_ownedType_0_0=ruleCollectionTypeCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:7977:1: ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )?
            int alt188=2;
            int LA188_0 = input.LA(1);

            if ( (LA188_0==RULE_SINGLE_QUOTED_STRING||(LA188_0>=RULE_INT && LA188_0<=RULE_ESCAPED_ID)||LA188_0==17||LA188_0==19||(LA188_0>=22 && LA188_0<=26)||(LA188_0>=29 && LA188_0<=34)||LA188_0==39||(LA188_0>=42 && LA188_0<=48)||(LA188_0>=50 && LA188_0<=52)||(LA188_0>=54 && LA188_0<=56)||(LA188_0>=58 && LA188_0<=60)||(LA188_0>=62 && LA188_0<=70)||LA188_0==72||LA188_0==74||LA188_0==76||LA188_0==79||LA188_0==81||LA188_0==83||(LA188_0>=85 && LA188_0<=89)||(LA188_0>=91 && LA188_0<=96)||LA188_0==98||LA188_0==100||(LA188_0>=102 && LA188_0<=108)||(LA188_0>=127 && LA188_0<=141)||LA188_0==143||(LA188_0>=145 && LA188_0<=148)||LA188_0==154||(LA188_0>=159 && LA188_0<=160)) ) {
                alt188=1;
            }
            switch (alt188) {
                case 1 :
                    // InternalQVTimperative.g:7977:2: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    {
                    // InternalQVTimperative.g:7977:2: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) )
                    // InternalQVTimperative.g:7978:1: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    {
                    // InternalQVTimperative.g:7978:1: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    // InternalQVTimperative.g:7979:3: lv_ownedParts_2_0= ruleCollectionLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_112);
                    lv_ownedParts_2_0=ruleCollectionLiteralPartCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParts",
                              		lv_ownedParts_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionLiteralPartCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:7995:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    loop187:
                    do {
                        int alt187=2;
                        int LA187_0 = input.LA(1);

                        if ( (LA187_0==18) ) {
                            alt187=1;
                        }


                        switch (alt187) {
                    	case 1 :
                    	    // InternalQVTimperative.g:7995:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_126); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTimperative.g:7999:1: ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    // InternalQVTimperative.g:8000:1: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    {
                    	    // InternalQVTimperative.g:8000:1: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    // InternalQVTimperative.g:8001:3: lv_ownedParts_4_0= ruleCollectionLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_112);
                    	    lv_ownedParts_4_0=ruleCollectionLiteralPartCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParts",
                    	              		lv_ownedParts_4_0,
                    	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionLiteralPartCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCollectionLiteralPartCS"
    // InternalQVTimperative.g:8029:1: entryRuleCollectionLiteralPartCS returns [EObject current=null] : iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF ;
    public final EObject entryRuleCollectionLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralPartCS = null;


        try {
            // InternalQVTimperative.g:8030:2: (iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF )
            // InternalQVTimperative.g:8031:2: iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionLiteralPartCS=ruleCollectionLiteralPartCS();

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

            }

        }

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


    // $ANTLR start "ruleCollectionLiteralPartCS"
    // InternalQVTimperative.g:8038:1: ruleCollectionLiteralPartCS returns [EObject current=null] : ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) ) ;
    public final EObject ruleCollectionLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedExpression_0_0 = null;

        EObject lv_ownedLastExpression_2_0 = null;

        EObject lv_ownedExpression_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8041:28: ( ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) ) )
            // InternalQVTimperative.g:8042:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            {
            // InternalQVTimperative.g:8042:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            int alt190=2;
            alt190 = dfa190.predict(input);
            switch (alt190) {
                case 1 :
                    // InternalQVTimperative.g:8042:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTimperative.g:8042:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    // InternalQVTimperative.g:8042:3: ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    {
                    // InternalQVTimperative.g:8042:3: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalQVTimperative.g:8043:1: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:8043:1: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalQVTimperative.g:8044:3: lv_ownedExpression_0_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_127);
                    lv_ownedExpression_0_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_0_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:8060:2: (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    int alt189=2;
                    int LA189_0 = input.LA(1);

                    if ( (LA189_0==27) ) {
                        alt189=1;
                    }
                    switch (alt189) {
                        case 1 :
                            // InternalQVTimperative.g:8060:4: otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            {
                            otherlv_1=(Token)match(input,27,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());

                            }
                            // InternalQVTimperative.g:8064:1: ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            // InternalQVTimperative.g:8065:1: (lv_ownedLastExpression_2_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:8065:1: (lv_ownedLastExpression_2_0= ruleExpCS )
                            // InternalQVTimperative.g:8066:3: lv_ownedLastExpression_2_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedLastExpression_2_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedLastExpression",
                                      		lv_ownedLastExpression_2_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:8083:6: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    {
                    // InternalQVTimperative.g:8083:6: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    // InternalQVTimperative.g:8084:1: (lv_ownedExpression_3_0= rulePatternExpCS )
                    {
                    // InternalQVTimperative.g:8084:1: (lv_ownedExpression_3_0= rulePatternExpCS )
                    // InternalQVTimperative.g:8085:3: lv_ownedExpression_3_0= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExpression_3_0=rulePatternExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExpression",
                              		lv_ownedExpression_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCollectionPatternCS"
    // InternalQVTimperative.g:8109:1: entryRuleCollectionPatternCS returns [EObject current=null] : iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF ;
    public final EObject entryRuleCollectionPatternCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionPatternCS = null;


        try {
            // InternalQVTimperative.g:8110:2: (iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF )
            // InternalQVTimperative.g:8111:2: iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionPatternCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionPatternCS=ruleCollectionPatternCS();

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

            }

        }

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


    // $ANTLR start "ruleCollectionPatternCS"
    // InternalQVTimperative.g:8118:1: ruleCollectionPatternCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' ) ;
    public final EObject ruleCollectionPatternCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;

        AntlrDatatypeRuleToken lv_restVariableName_6_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8121:28: ( ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' ) )
            // InternalQVTimperative.g:8122:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' )
            {
            // InternalQVTimperative.g:8122:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' )
            // InternalQVTimperative.g:8122:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}'
            {
            // InternalQVTimperative.g:8122:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalQVTimperative.g:8123:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalQVTimperative.g:8123:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalQVTimperative.g:8124:3: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_ownedType_0_0=ruleCollectionTypeCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:8144:1: ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )?
            int alt192=2;
            int LA192_0 = input.LA(1);

            if ( ((LA192_0>=RULE_SIMPLE_ID && LA192_0<=RULE_ESCAPED_ID)||LA192_0==17||LA192_0==19||(LA192_0>=22 && LA192_0<=26)||(LA192_0>=29 && LA192_0<=34)||LA192_0==39||(LA192_0>=43 && LA192_0<=48)||(LA192_0>=50 && LA192_0<=52)||(LA192_0>=54 && LA192_0<=55)||(LA192_0>=58 && LA192_0<=60)||(LA192_0>=62 && LA192_0<=70)||LA192_0==72||LA192_0==74||LA192_0==76||LA192_0==79||LA192_0==81||LA192_0==83||(LA192_0>=85 && LA192_0<=89)||(LA192_0>=91 && LA192_0<=96)||LA192_0==98||LA192_0==100||(LA192_0>=102 && LA192_0<=105)) ) {
                alt192=1;
            }
            switch (alt192) {
                case 1 :
                    // InternalQVTimperative.g:8144:2: ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    {
                    // InternalQVTimperative.g:8144:2: ( (lv_ownedParts_2_0= rulePatternExpCS ) )
                    // InternalQVTimperative.g:8145:1: (lv_ownedParts_2_0= rulePatternExpCS )
                    {
                    // InternalQVTimperative.g:8145:1: (lv_ownedParts_2_0= rulePatternExpCS )
                    // InternalQVTimperative.g:8146:3: lv_ownedParts_2_0= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_128);
                    lv_ownedParts_2_0=rulePatternExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParts",
                              		lv_ownedParts_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:8162:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )*
                    loop191:
                    do {
                        int alt191=2;
                        int LA191_0 = input.LA(1);

                        if ( (LA191_0==18) ) {
                            alt191=1;
                        }


                        switch (alt191) {
                    	case 1 :
                    	    // InternalQVTimperative.g:8162:4: otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_126); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTimperative.g:8166:1: ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    // InternalQVTimperative.g:8167:1: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    {
                    	    // InternalQVTimperative.g:8167:1: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    // InternalQVTimperative.g:8168:3: lv_ownedParts_4_0= rulePatternExpCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_128);
                    	    lv_ownedParts_4_0=rulePatternExpCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParts",
                    	              		lv_ownedParts_4_0,
                    	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    // InternalQVTimperative.g:8184:4: (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    // InternalQVTimperative.g:8184:6: otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    {
                    otherlv_5=(Token)match(input,142,FollowSets000.FOLLOW_129); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());

                    }
                    // InternalQVTimperative.g:8188:1: ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    // InternalQVTimperative.g:8189:1: (lv_restVariableName_6_0= ruleIdentifier )
                    {
                    // InternalQVTimperative.g:8189:1: (lv_restVariableName_6_0= ruleIdentifier )
                    // InternalQVTimperative.g:8190:3: lv_restVariableName_6_0= ruleIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_restVariableName_6_0=ruleIdentifier();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                      	        }
                             		set(
                             			current,
                             			"restVariableName",
                              		lv_restVariableName_6_0,
                              		"org.eclipse.ocl.xtext.base.Base.Identifier");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleShadowPartCS"
    // InternalQVTimperative.g:8218:1: entryRuleShadowPartCS returns [EObject current=null] : iv_ruleShadowPartCS= ruleShadowPartCS EOF ;
    public final EObject entryRuleShadowPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleShadowPartCS = null;


        try {
            // InternalQVTimperative.g:8219:2: (iv_ruleShadowPartCS= ruleShadowPartCS EOF )
            // InternalQVTimperative.g:8220:2: iv_ruleShadowPartCS= ruleShadowPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getShadowPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleShadowPartCS=ruleShadowPartCS();

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

            }

        }

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


    // $ANTLR start "ruleShadowPartCS"
    // InternalQVTimperative.g:8227:1: ruleShadowPartCS returns [EObject current=null] : ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) ) ;
    public final EObject ruleShadowPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedInitExpression_2_1 = null;

        EObject lv_ownedInitExpression_2_2 = null;

        EObject lv_ownedInitExpression_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8230:28: ( ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) ) )
            // InternalQVTimperative.g:8231:1: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            {
            // InternalQVTimperative.g:8231:1: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            int alt194=2;
            int LA194_0 = input.LA(1);

            if ( ((LA194_0>=RULE_SIMPLE_ID && LA194_0<=RULE_ESCAPED_ID)||LA194_0==17||LA194_0==19||(LA194_0>=22 && LA194_0<=23)||(LA194_0>=25 && LA194_0<=26)||(LA194_0>=29 && LA194_0<=34)||LA194_0==39||(LA194_0>=43 && LA194_0<=48)||(LA194_0>=50 && LA194_0<=52)||(LA194_0>=54 && LA194_0<=55)||(LA194_0>=58 && LA194_0<=60)||(LA194_0>=62 && LA194_0<=70)||LA194_0==72||LA194_0==74||LA194_0==76||LA194_0==79||LA194_0==81||LA194_0==83||(LA194_0>=85 && LA194_0<=89)||(LA194_0>=91 && LA194_0<=96)||LA194_0==98||LA194_0==100||(LA194_0>=102 && LA194_0<=105)) ) {
                alt194=1;
            }
            else if ( (LA194_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt194=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 194, 0, input);

                throw nvae;
            }
            switch (alt194) {
                case 1 :
                    // InternalQVTimperative.g:8231:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    {
                    // InternalQVTimperative.g:8231:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    // InternalQVTimperative.g:8231:3: ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    {
                    // InternalQVTimperative.g:8231:3: ( ( ruleUnrestrictedName ) )
                    // InternalQVTimperative.g:8232:1: ( ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:8232:1: ( ruleUnrestrictedName )
                    // InternalQVTimperative.g:8233:3: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      		  /* */

                    }
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getShadowPartCSRule());
                      	        }

                    }
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_130);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_1, grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());

                    }
                    // InternalQVTimperative.g:8253:1: ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    // InternalQVTimperative.g:8254:1: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    {
                    // InternalQVTimperative.g:8254:1: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    // InternalQVTimperative.g:8255:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    {
                    // InternalQVTimperative.g:8255:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    int alt193=2;
                    alt193 = dfa193.predict(input);
                    switch (alt193) {
                        case 1 :
                            // InternalQVTimperative.g:8256:3: lv_ownedInitExpression_2_1= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_2_1=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_2_1,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }
                            break;
                        case 2 :
                            // InternalQVTimperative.g:8271:8: lv_ownedInitExpression_2_2= rulePatternExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_2_2=rulePatternExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_2_2,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }
                            break;

                    }


                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:8290:6: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    {
                    // InternalQVTimperative.g:8290:6: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    // InternalQVTimperative.g:8291:1: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    {
                    // InternalQVTimperative.g:8291:1: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    // InternalQVTimperative.g:8292:3: lv_ownedInitExpression_3_0= ruleStringLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedInitExpression_3_0=ruleStringLiteralExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedInitExpression",
                              		lv_ownedInitExpression_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.StringLiteralExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePatternExpCS"
    // InternalQVTimperative.g:8316:1: entryRulePatternExpCS returns [EObject current=null] : iv_rulePatternExpCS= rulePatternExpCS EOF ;
    public final EObject entryRulePatternExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternExpCS = null;


        try {
            // InternalQVTimperative.g:8317:2: (iv_rulePatternExpCS= rulePatternExpCS EOF )
            // InternalQVTimperative.g:8318:2: iv_rulePatternExpCS= rulePatternExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPatternExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePatternExpCS=rulePatternExpCS();

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

            }

        }

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


    // $ANTLR start "rulePatternExpCS"
    // InternalQVTimperative.g:8325:1: rulePatternExpCS returns [EObject current=null] : ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject rulePatternExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_patternVariableName_0_0 = null;

        EObject lv_ownedPatternType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8328:28: ( ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTimperative.g:8329:1: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTimperative.g:8329:1: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTimperative.g:8329:2: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTimperative.g:8329:2: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )?
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( ((LA195_0>=RULE_SIMPLE_ID && LA195_0<=RULE_ESCAPED_ID)||LA195_0==17||LA195_0==19||(LA195_0>=22 && LA195_0<=23)||(LA195_0>=25 && LA195_0<=26)||(LA195_0>=29 && LA195_0<=34)||LA195_0==39||(LA195_0>=43 && LA195_0<=48)||(LA195_0>=50 && LA195_0<=52)||(LA195_0>=54 && LA195_0<=55)||(LA195_0>=58 && LA195_0<=60)||(LA195_0>=62 && LA195_0<=70)||LA195_0==72||LA195_0==74||LA195_0==76||LA195_0==79||LA195_0==81||LA195_0==83||(LA195_0>=85 && LA195_0<=89)||(LA195_0>=91 && LA195_0<=96)||LA195_0==98||LA195_0==100||(LA195_0>=102 && LA195_0<=105)) ) {
                alt195=1;
            }
            switch (alt195) {
                case 1 :
                    // InternalQVTimperative.g:8330:1: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    {
                    // InternalQVTimperative.g:8330:1: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    // InternalQVTimperative.g:8331:3: lv_patternVariableName_0_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_patternVariableName_0_0=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPatternExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"patternVariableName",
                              		lv_patternVariableName_0_0,
                              		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getPatternExpCSAccess().getColonKeyword_1());

            }
            // InternalQVTimperative.g:8351:1: ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            // InternalQVTimperative.g:8352:1: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            {
            // InternalQVTimperative.g:8352:1: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            // InternalQVTimperative.g:8353:3: lv_ownedPatternType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedPatternType_2_0=ruleTypeExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPatternExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPatternType",
                      		lv_ownedPatternType_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleLambdaLiteralExpCS"
    // InternalQVTimperative.g:8377:1: entryRuleLambdaLiteralExpCS returns [EObject current=null] : iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF ;
    public final EObject entryRuleLambdaLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLambdaLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8378:2: (iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF )
            // InternalQVTimperative.g:8379:2: iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLambdaLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLambdaLiteralExpCS=ruleLambdaLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleLambdaLiteralExpCS"
    // InternalQVTimperative.g:8386:1: ruleLambdaLiteralExpCS returns [EObject current=null] : (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' ) ;
    public final EObject ruleLambdaLiteralExpCS() throws RecognitionException {
        EObject current = null;

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


         enterRule();

        try {
            // InternalQVTimperative.g:8389:28: ( (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' ) )
            // InternalQVTimperative.g:8390:1: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            {
            // InternalQVTimperative.g:8390:1: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            // InternalQVTimperative.g:8390:3: otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}'
            {
            otherlv_0=(Token)match(input,143,FollowSets000.FOLLOW_41); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());

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

                  	newLeafNode(otherlv_1, grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:8398:1: ( (lv_ownedExpressionCS_2_0= ruleExpCS ) )
            // InternalQVTimperative.g:8399:1: (lv_ownedExpressionCS_2_0= ruleExpCS )
            {
            // InternalQVTimperative.g:8399:1: (lv_ownedExpressionCS_2_0= ruleExpCS )
            // InternalQVTimperative.g:8400:3: lv_ownedExpressionCS_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_58);
            lv_ownedExpressionCS_2_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getLambdaLiteralExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedExpressionCS",
                      		lv_ownedExpressionCS_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_3, grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMapLiteralExpCS"
    // InternalQVTimperative.g:8428:1: entryRuleMapLiteralExpCS returns [EObject current=null] : iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF ;
    public final EObject entryRuleMapLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8429:2: (iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF )
            // InternalQVTimperative.g:8430:2: iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapLiteralExpCS=ruleMapLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleMapLiteralExpCS"
    // InternalQVTimperative.g:8437:1: ruleMapLiteralExpCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleMapLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8440:28: ( ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTimperative.g:8441:1: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTimperative.g:8441:1: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTimperative.g:8441:2: ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTimperative.g:8441:2: ( (lv_ownedType_0_0= ruleMapTypeCS ) )
            // InternalQVTimperative.g:8442:1: (lv_ownedType_0_0= ruleMapTypeCS )
            {
            // InternalQVTimperative.g:8442:1: (lv_ownedType_0_0= ruleMapTypeCS )
            // InternalQVTimperative.g:8443:3: lv_ownedType_0_0= ruleMapTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_ownedType_0_0=ruleMapTypeCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapTypeCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:8463:1: ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )?
            int alt197=2;
            int LA197_0 = input.LA(1);

            if ( (LA197_0==RULE_SINGLE_QUOTED_STRING||(LA197_0>=RULE_INT && LA197_0<=RULE_ESCAPED_ID)||LA197_0==17||LA197_0==19||(LA197_0>=22 && LA197_0<=23)||(LA197_0>=25 && LA197_0<=26)||(LA197_0>=29 && LA197_0<=34)||LA197_0==39||(LA197_0>=42 && LA197_0<=48)||(LA197_0>=50 && LA197_0<=52)||(LA197_0>=54 && LA197_0<=56)||(LA197_0>=58 && LA197_0<=60)||(LA197_0>=62 && LA197_0<=70)||LA197_0==72||LA197_0==74||LA197_0==76||LA197_0==79||LA197_0==81||LA197_0==83||(LA197_0>=85 && LA197_0<=89)||(LA197_0>=91 && LA197_0<=96)||LA197_0==98||LA197_0==100||(LA197_0>=102 && LA197_0<=108)||(LA197_0>=127 && LA197_0<=141)||LA197_0==143||(LA197_0>=145 && LA197_0<=148)||LA197_0==154||(LA197_0>=159 && LA197_0<=160)) ) {
                alt197=1;
            }
            switch (alt197) {
                case 1 :
                    // InternalQVTimperative.g:8463:2: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    {
                    // InternalQVTimperative.g:8463:2: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) )
                    // InternalQVTimperative.g:8464:1: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    {
                    // InternalQVTimperative.g:8464:1: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    // InternalQVTimperative.g:8465:3: lv_ownedParts_2_0= ruleMapLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_112);
                    lv_ownedParts_2_0=ruleMapLiteralPartCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParts",
                              		lv_ownedParts_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapLiteralPartCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:8481:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    loop196:
                    do {
                        int alt196=2;
                        int LA196_0 = input.LA(1);

                        if ( (LA196_0==18) ) {
                            alt196=1;
                        }


                        switch (alt196) {
                    	case 1 :
                    	    // InternalQVTimperative.g:8481:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTimperative.g:8485:1: ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    // InternalQVTimperative.g:8486:1: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    {
                    	    // InternalQVTimperative.g:8486:1: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    // InternalQVTimperative.g:8487:3: lv_ownedParts_4_0= ruleMapLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_112);
                    	    lv_ownedParts_4_0=ruleMapLiteralPartCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParts",
                    	              		lv_ownedParts_4_0,
                    	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapLiteralPartCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleMapLiteralPartCS"
    // InternalQVTimperative.g:8515:1: entryRuleMapLiteralPartCS returns [EObject current=null] : iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF ;
    public final EObject entryRuleMapLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralPartCS = null;


        try {
            // InternalQVTimperative.g:8516:2: (iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF )
            // InternalQVTimperative.g:8517:2: iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapLiteralPartCS=ruleMapLiteralPartCS();

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

            }

        }

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


    // $ANTLR start "ruleMapLiteralPartCS"
    // InternalQVTimperative.g:8524:1: ruleMapLiteralPartCS returns [EObject current=null] : ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) ) ;
    public final EObject ruleMapLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedKey_0_0 = null;

        EObject lv_ownedValue_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8527:28: ( ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) ) )
            // InternalQVTimperative.g:8528:1: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            {
            // InternalQVTimperative.g:8528:1: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            // InternalQVTimperative.g:8528:2: ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) )
            {
            // InternalQVTimperative.g:8528:2: ( (lv_ownedKey_0_0= ruleExpCS ) )
            // InternalQVTimperative.g:8529:1: (lv_ownedKey_0_0= ruleExpCS )
            {
            // InternalQVTimperative.g:8529:1: (lv_ownedKey_0_0= ruleExpCS )
            // InternalQVTimperative.g:8530:3: lv_ownedKey_0_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_132);
            lv_ownedKey_0_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMapLiteralPartCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedKey",
                      		lv_ownedKey_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());

            }
            // InternalQVTimperative.g:8550:1: ( (lv_ownedValue_2_0= ruleExpCS ) )
            // InternalQVTimperative.g:8551:1: (lv_ownedValue_2_0= ruleExpCS )
            {
            // InternalQVTimperative.g:8551:1: (lv_ownedValue_2_0= ruleExpCS )
            // InternalQVTimperative.g:8552:3: lv_ownedValue_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedValue_2_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMapLiteralPartCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedValue",
                      		lv_ownedValue_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePrimitiveLiteralExpCS"
    // InternalQVTimperative.g:8576:1: entryRulePrimitiveLiteralExpCS returns [EObject current=null] : iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF ;
    public final EObject entryRulePrimitiveLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8577:2: (iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF )
            // InternalQVTimperative.g:8578:2: iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveLiteralExpCS=rulePrimitiveLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "rulePrimitiveLiteralExpCS"
    // InternalQVTimperative.g:8585:1: rulePrimitiveLiteralExpCS returns [EObject current=null] : (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS ) ;
    public final EObject rulePrimitiveLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_NumberLiteralExpCS_0 = null;

        EObject this_StringLiteralExpCS_1 = null;

        EObject this_BooleanLiteralExpCS_2 = null;

        EObject this_UnlimitedNaturalLiteralExpCS_3 = null;

        EObject this_InvalidLiteralExpCS_4 = null;

        EObject this_NullLiteralExpCS_5 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8588:28: ( (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS ) )
            // InternalQVTimperative.g:8589:1: (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS )
            {
            // InternalQVTimperative.g:8589:1: (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS )
            int alt198=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt198=1;
                }
                break;
            case RULE_SINGLE_QUOTED_STRING:
                {
                alt198=2;
                }
                break;
            case 145:
            case 146:
                {
                alt198=3;
                }
                break;
            case 42:
                {
                alt198=4;
                }
                break;
            case 147:
                {
                alt198=5;
                }
                break;
            case 148:
                {
                alt198=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 198, 0, input);

                throw nvae;
            }

            switch (alt198) {
                case 1 :
                    // InternalQVTimperative.g:8590:2: this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NumberLiteralExpCS_0=ruleNumberLiteralExpCS();

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

                              current = this_NumberLiteralExpCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:8603:2: this_StringLiteralExpCS_1= ruleStringLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StringLiteralExpCS_1=ruleStringLiteralExpCS();

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

                              current = this_StringLiteralExpCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:8616:2: this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BooleanLiteralExpCS_2=ruleBooleanLiteralExpCS();

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

                              current = this_BooleanLiteralExpCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:8629:2: this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_UnlimitedNaturalLiteralExpCS_3=ruleUnlimitedNaturalLiteralExpCS();

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

                              current = this_UnlimitedNaturalLiteralExpCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:8642:2: this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InvalidLiteralExpCS_4=ruleInvalidLiteralExpCS();

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

                              current = this_InvalidLiteralExpCS_4;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:8655:2: this_NullLiteralExpCS_5= ruleNullLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NullLiteralExpCS_5=ruleNullLiteralExpCS();

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

                              current = this_NullLiteralExpCS_5;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTupleLiteralExpCS"
    // InternalQVTimperative.g:8674:1: entryRuleTupleLiteralExpCS returns [EObject current=null] : iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF ;
    public final EObject entryRuleTupleLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8675:2: (iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF )
            // InternalQVTimperative.g:8676:2: iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleLiteralExpCS=ruleTupleLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleTupleLiteralExpCS"
    // InternalQVTimperative.g:8683:1: ruleTupleLiteralExpCS returns [EObject current=null] : (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' ) ;
    public final EObject ruleTupleLiteralExpCS() throws RecognitionException {
        EObject current = null;

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

        EObject lv_ownedParts_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8686:28: ( (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' ) )
            // InternalQVTimperative.g:8687:1: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            {
            // InternalQVTimperative.g:8687:1: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            // InternalQVTimperative.g:8687:3: otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}'
            {
            otherlv_0=(Token)match(input,128,FollowSets000.FOLLOW_41); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());

            }
            otherlv_1=(Token)match(input,35,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:8695:1: ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) )
            // InternalQVTimperative.g:8696:1: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            {
            // InternalQVTimperative.g:8696:1: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            // InternalQVTimperative.g:8697:3: lv_ownedParts_2_0= ruleTupleLiteralPartCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_112);
            lv_ownedParts_2_0=ruleTupleLiteralPartCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTupleLiteralExpCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedParts",
                      		lv_ownedParts_2_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TupleLiteralPartCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:8713:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )*
            loop199:
            do {
                int alt199=2;
                int LA199_0 = input.LA(1);

                if ( (LA199_0==18) ) {
                    alt199=1;
                }


                switch (alt199) {
            	case 1 :
            	    // InternalQVTimperative.g:8713:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    {
            	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_3, grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());

            	    }
            	    // InternalQVTimperative.g:8717:1: ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    // InternalQVTimperative.g:8718:1: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    {
            	    // InternalQVTimperative.g:8718:1: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    // InternalQVTimperative.g:8719:3: lv_ownedParts_4_0= ruleTupleLiteralPartCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_112);
            	    lv_ownedParts_4_0=ruleTupleLiteralPartCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTupleLiteralExpCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedParts",
            	              		lv_ownedParts_4_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TupleLiteralPartCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

                  	newLeafNode(otherlv_5, grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTupleLiteralPartCS"
    // InternalQVTimperative.g:8747:1: entryRuleTupleLiteralPartCS returns [EObject current=null] : iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF ;
    public final EObject entryRuleTupleLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralPartCS = null;


        try {
            // InternalQVTimperative.g:8748:2: (iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF )
            // InternalQVTimperative.g:8749:2: iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleLiteralPartCS=ruleTupleLiteralPartCS();

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

            }

        }

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


    // $ANTLR start "ruleTupleLiteralPartCS"
    // InternalQVTimperative.g:8756:1: ruleTupleLiteralPartCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) ) ;
    public final EObject ruleTupleLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8759:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) ) )
            // InternalQVTimperative.g:8760:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            {
            // InternalQVTimperative.g:8760:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            // InternalQVTimperative.g:8760:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            {
            // InternalQVTimperative.g:8760:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:8761:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:8761:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:8762:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_133);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:8778:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt200=2;
            int LA200_0 = input.LA(1);

            if ( (LA200_0==24) ) {
                alt200=1;
            }
            switch (alt200) {
                case 1 :
                    // InternalQVTimperative.g:8778:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTimperative.g:8782:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:8783:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:8783:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:8784:3: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_130);
                    lv_ownedType_2_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_3, grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());

            }
            // InternalQVTimperative.g:8804:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            // InternalQVTimperative.g:8805:1: (lv_ownedInitExpression_4_0= ruleExpCS )
            {
            // InternalQVTimperative.g:8805:1: (lv_ownedInitExpression_4_0= ruleExpCS )
            // InternalQVTimperative.g:8806:3: lv_ownedInitExpression_4_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInitExpression_4_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedInitExpression",
                      		lv_ownedInitExpression_4_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNumberLiteralExpCS"
    // InternalQVTimperative.g:8830:1: entryRuleNumberLiteralExpCS returns [EObject current=null] : iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF ;
    public final EObject entryRuleNumberLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNumberLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8831:2: (iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF )
            // InternalQVTimperative.g:8832:2: iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNumberLiteralExpCS=ruleNumberLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleNumberLiteralExpCS"
    // InternalQVTimperative.g:8839:1: ruleNumberLiteralExpCS returns [EObject current=null] : ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) ) ;
    public final EObject ruleNumberLiteralExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_symbol_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8842:28: ( ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) ) )
            // InternalQVTimperative.g:8843:1: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            {
            // InternalQVTimperative.g:8843:1: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            // InternalQVTimperative.g:8844:1: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            {
            // InternalQVTimperative.g:8844:1: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            // InternalQVTimperative.g:8845:3: lv_symbol_0_0= ruleNUMBER_LITERAL
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_symbol_0_0=ruleNUMBER_LITERAL();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNumberLiteralExpCSRule());
              	        }
                     		set(
                     			current,
                     			"symbol",
                      		lv_symbol_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.NUMBER_LITERAL");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleStringLiteralExpCS"
    // InternalQVTimperative.g:8869:1: entryRuleStringLiteralExpCS returns [EObject current=null] : iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF ;
    public final EObject entryRuleStringLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStringLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8870:2: (iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF )
            // InternalQVTimperative.g:8871:2: iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStringLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStringLiteralExpCS=ruleStringLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleStringLiteralExpCS"
    // InternalQVTimperative.g:8878:1: ruleStringLiteralExpCS returns [EObject current=null] : ( (lv_segments_0_0= ruleStringLiteral ) )+ ;
    public final EObject ruleStringLiteralExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_segments_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:8881:28: ( ( (lv_segments_0_0= ruleStringLiteral ) )+ )
            // InternalQVTimperative.g:8882:1: ( (lv_segments_0_0= ruleStringLiteral ) )+
            {
            // InternalQVTimperative.g:8882:1: ( (lv_segments_0_0= ruleStringLiteral ) )+
            int cnt201=0;
            loop201:
            do {
                int alt201=2;
                int LA201_0 = input.LA(1);

                if ( (LA201_0==RULE_SINGLE_QUOTED_STRING) ) {
                    alt201=1;
                }


                switch (alt201) {
            	case 1 :
            	    // InternalQVTimperative.g:8883:1: (lv_segments_0_0= ruleStringLiteral )
            	    {
            	    // InternalQVTimperative.g:8883:1: (lv_segments_0_0= ruleStringLiteral )
            	    // InternalQVTimperative.g:8884:3: lv_segments_0_0= ruleStringLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_134);
            	    lv_segments_0_0=ruleStringLiteral();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStringLiteralExpCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"segments",
            	              		lv_segments_0_0,
            	              		"org.eclipse.ocl.xtext.base.Base.StringLiteral");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleBooleanLiteralExpCS"
    // InternalQVTimperative.g:8908:1: entryRuleBooleanLiteralExpCS returns [EObject current=null] : iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF ;
    public final EObject entryRuleBooleanLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBooleanLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8909:2: (iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF )
            // InternalQVTimperative.g:8910:2: iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBooleanLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBooleanLiteralExpCS=ruleBooleanLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleBooleanLiteralExpCS"
    // InternalQVTimperative.g:8917:1: ruleBooleanLiteralExpCS returns [EObject current=null] : ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) ) ;
    public final EObject ruleBooleanLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token lv_symbol_0_0=null;
        Token lv_symbol_1_0=null;

         enterRule();

        try {
            // InternalQVTimperative.g:8920:28: ( ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) ) )
            // InternalQVTimperative.g:8921:1: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            {
            // InternalQVTimperative.g:8921:1: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            int alt202=2;
            int LA202_0 = input.LA(1);

            if ( (LA202_0==145) ) {
                alt202=1;
            }
            else if ( (LA202_0==146) ) {
                alt202=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 202, 0, input);

                throw nvae;
            }
            switch (alt202) {
                case 1 :
                    // InternalQVTimperative.g:8921:2: ( (lv_symbol_0_0= 'true' ) )
                    {
                    // InternalQVTimperative.g:8921:2: ( (lv_symbol_0_0= 'true' ) )
                    // InternalQVTimperative.g:8922:1: (lv_symbol_0_0= 'true' )
                    {
                    // InternalQVTimperative.g:8922:1: (lv_symbol_0_0= 'true' )
                    // InternalQVTimperative.g:8923:3: lv_symbol_0_0= 'true'
                    {
                    lv_symbol_0_0=(Token)match(input,145,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_symbol_0_0, grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getBooleanLiteralExpCSRule());
                      	        }
                             		setWithLastConsumed(current, "symbol", lv_symbol_0_0, "true");

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:8937:6: ( (lv_symbol_1_0= 'false' ) )
                    {
                    // InternalQVTimperative.g:8937:6: ( (lv_symbol_1_0= 'false' ) )
                    // InternalQVTimperative.g:8938:1: (lv_symbol_1_0= 'false' )
                    {
                    // InternalQVTimperative.g:8938:1: (lv_symbol_1_0= 'false' )
                    // InternalQVTimperative.g:8939:3: lv_symbol_1_0= 'false'
                    {
                    lv_symbol_1_0=(Token)match(input,146,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_symbol_1_0, grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getBooleanLiteralExpCSRule());
                      	        }
                             		setWithLastConsumed(current, "symbol", lv_symbol_1_0, "false");

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleUnlimitedNaturalLiteralExpCS"
    // InternalQVTimperative.g:8960:1: entryRuleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF ;
    public final EObject entryRuleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnlimitedNaturalLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8961:2: (iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF )
            // InternalQVTimperative.g:8962:2: iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnlimitedNaturalLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnlimitedNaturalLiteralExpCS=ruleUnlimitedNaturalLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleUnlimitedNaturalLiteralExpCS"
    // InternalQVTimperative.g:8969:1: ruleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : ( () otherlv_1= '*' ) ;
    public final EObject ruleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:8972:28: ( ( () otherlv_1= '*' ) )
            // InternalQVTimperative.g:8973:1: ( () otherlv_1= '*' )
            {
            // InternalQVTimperative.g:8973:1: ( () otherlv_1= '*' )
            // InternalQVTimperative.g:8973:2: () otherlv_1= '*'
            {
            // InternalQVTimperative.g:8973:2: ()
            // InternalQVTimperative.g:8974:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleInvalidLiteralExpCS"
    // InternalQVTimperative.g:8994:1: entryRuleInvalidLiteralExpCS returns [EObject current=null] : iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF ;
    public final EObject entryRuleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInvalidLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:8995:2: (iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF )
            // InternalQVTimperative.g:8996:2: iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInvalidLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInvalidLiteralExpCS=ruleInvalidLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleInvalidLiteralExpCS"
    // InternalQVTimperative.g:9003:1: ruleInvalidLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'invalid' ) ;
    public final EObject ruleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:9006:28: ( ( () otherlv_1= 'invalid' ) )
            // InternalQVTimperative.g:9007:1: ( () otherlv_1= 'invalid' )
            {
            // InternalQVTimperative.g:9007:1: ( () otherlv_1= 'invalid' )
            // InternalQVTimperative.g:9007:2: () otherlv_1= 'invalid'
            {
            // InternalQVTimperative.g:9007:2: ()
            // InternalQVTimperative.g:9008:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNullLiteralExpCS"
    // InternalQVTimperative.g:9028:1: entryRuleNullLiteralExpCS returns [EObject current=null] : iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF ;
    public final EObject entryRuleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNullLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:9029:2: (iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF )
            // InternalQVTimperative.g:9030:2: iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNullLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNullLiteralExpCS=ruleNullLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleNullLiteralExpCS"
    // InternalQVTimperative.g:9037:1: ruleNullLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:9040:28: ( ( () otherlv_1= 'null' ) )
            // InternalQVTimperative.g:9041:1: ( () otherlv_1= 'null' )
            {
            // InternalQVTimperative.g:9041:1: ( () otherlv_1= 'null' )
            // InternalQVTimperative.g:9041:2: () otherlv_1= 'null'
            {
            // InternalQVTimperative.g:9041:2: ()
            // InternalQVTimperative.g:9042:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeLiteralCS"
    // InternalQVTimperative.g:9062:1: entryRuleTypeLiteralCS returns [EObject current=null] : iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF ;
    public final EObject entryRuleTypeLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralCS = null;


        try {
            // InternalQVTimperative.g:9063:2: (iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF )
            // InternalQVTimperative.g:9064:2: iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralCS=ruleTypeLiteralCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeLiteralCS"
    // InternalQVTimperative.g:9071:1: ruleTypeLiteralCS returns [EObject current=null] : (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS ) ;
    public final EObject ruleTypeLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject this_PrimitiveTypeCS_0 = null;

        EObject this_CollectionTypeCS_1 = null;

        EObject this_MapTypeCS_2 = null;

        EObject this_TupleTypeCS_3 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9074:28: ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS ) )
            // InternalQVTimperative.g:9075:1: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            {
            // InternalQVTimperative.g:9075:1: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            int alt203=4;
            switch ( input.LA(1) ) {
            case 129:
            case 130:
            case 131:
            case 132:
            case 133:
            case 134:
            case 135:
            case 136:
                {
                alt203=1;
                }
                break;
            case 137:
            case 138:
            case 139:
            case 140:
            case 141:
                {
                alt203=2;
                }
                break;
            case 127:
                {
                alt203=3;
                }
                break;
            case 128:
                {
                alt203=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 203, 0, input);

                throw nvae;
            }

            switch (alt203) {
                case 1 :
                    // InternalQVTimperative.g:9076:2: this_PrimitiveTypeCS_0= rulePrimitiveTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveTypeCS_0=rulePrimitiveTypeCS();

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

                              current = this_PrimitiveTypeCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9089:2: this_CollectionTypeCS_1= ruleCollectionTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionTypeCS_1=ruleCollectionTypeCS();

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

                              current = this_CollectionTypeCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:9102:2: this_MapTypeCS_2= ruleMapTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MapTypeCS_2=ruleMapTypeCS();

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

                              current = this_MapTypeCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:9115:2: this_TupleTypeCS_3= ruleTupleTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TupleTypeCS_3=ruleTupleTypeCS();

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

                              current = this_TupleTypeCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeLiteralWithMultiplicityCS"
    // InternalQVTimperative.g:9134:1: entryRuleTypeLiteralWithMultiplicityCS returns [EObject current=null] : iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF ;
    public final EObject entryRuleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralWithMultiplicityCS = null;


        try {
            // InternalQVTimperative.g:9135:2: (iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF )
            // InternalQVTimperative.g:9136:2: iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralWithMultiplicityCS=ruleTypeLiteralWithMultiplicityCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeLiteralWithMultiplicityCS"
    // InternalQVTimperative.g:9143:1: ruleTypeLiteralWithMultiplicityCS returns [EObject current=null] : (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeLiteralCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9146:28: ( (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTimperative.g:9147:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTimperative.g:9147:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTimperative.g:9148:2: this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_119);
            this_TypeLiteralCS_0=ruleTypeLiteralCS();

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

                      current = this_TypeLiteralCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalQVTimperative.g:9159:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt204=2;
            int LA204_0 = input.LA(1);

            if ( (LA204_0==151) ) {
                alt204=1;
            }
            switch (alt204) {
                case 1 :
                    // InternalQVTimperative.g:9160:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTimperative.g:9160:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTimperative.g:9161:3: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypeLiteralWithMultiplicityCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedMultiplicity",
                              		lv_ownedMultiplicity_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeLiteralExpCS"
    // InternalQVTimperative.g:9185:1: entryRuleTypeLiteralExpCS returns [EObject current=null] : iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF ;
    public final EObject entryRuleTypeLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralExpCS = null;


        try {
            // InternalQVTimperative.g:9186:2: (iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF )
            // InternalQVTimperative.g:9187:2: iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralExpCS=ruleTypeLiteralExpCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeLiteralExpCS"
    // InternalQVTimperative.g:9194:1: ruleTypeLiteralExpCS returns [EObject current=null] : ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) ) ;
    public final EObject ruleTypeLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedType_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9197:28: ( ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) ) )
            // InternalQVTimperative.g:9198:1: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            {
            // InternalQVTimperative.g:9198:1: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            // InternalQVTimperative.g:9199:1: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            {
            // InternalQVTimperative.g:9199:1: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            // InternalQVTimperative.g:9200:3: lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_0_0=ruleTypeLiteralWithMultiplicityCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTypeLiteralExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_0_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeLiteralWithMultiplicityCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeNameExpCS"
    // InternalQVTimperative.g:9224:1: entryRuleTypeNameExpCS returns [EObject current=null] : iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF ;
    public final EObject entryRuleTypeNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeNameExpCS = null;


        try {
            // InternalQVTimperative.g:9225:2: (iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF )
            // InternalQVTimperative.g:9226:2: iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeNameExpCS=ruleTypeNameExpCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeNameExpCS"
    // InternalQVTimperative.g:9233:1: ruleTypeNameExpCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? ) ;
    public final EObject ruleTypeNameExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedCurlyBracketedClause_1_0 = null;

        EObject lv_ownedPatternGuard_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9236:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? ) )
            // InternalQVTimperative.g:9237:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            {
            // InternalQVTimperative.g:9237:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            // InternalQVTimperative.g:9237:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            {
            // InternalQVTimperative.g:9237:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTimperative.g:9238:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTimperative.g:9238:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTimperative.g:9239:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_99);
            lv_ownedPathName_0_0=rulePathNameCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPathName",
                      		lv_ownedPathName_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:9255:2: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            int alt206=2;
            alt206 = dfa206.predict(input);
            switch (alt206) {
                case 1 :
                    // InternalQVTimperative.g:9255:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    {
                    // InternalQVTimperative.g:9255:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) )
                    // InternalQVTimperative.g:9256:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalQVTimperative.g:9256:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    // InternalQVTimperative.g:9257:3: lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_99);
                    lv_ownedCurlyBracketedClause_1_0=ruleCurlyBracketedClauseCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedCurlyBracketedClause",
                              		lv_ownedCurlyBracketedClause_1_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CurlyBracketedClauseCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:9273:2: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    int alt205=2;
                    alt205 = dfa205.predict(input);
                    switch (alt205) {
                        case 1 :
                            // InternalQVTimperative.g:9273:4: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
                            {
                            otherlv_2=(Token)match(input,35,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_2, grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());

                            }
                            // InternalQVTimperative.g:9277:1: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
                            // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            // InternalQVTimperative.g:9279:3: lv_ownedPatternGuard_3_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_58);
                            lv_ownedPatternGuard_3_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedPatternGuard",
                                      		lv_ownedPatternGuard_3_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());

                            }

                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeExpWithoutMultiplicityCS"
    // InternalQVTimperative.g:9307:1: entryRuleTypeExpWithoutMultiplicityCS returns [EObject current=null] : iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF ;
    public final EObject entryRuleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpWithoutMultiplicityCS = null;


        try {
            // InternalQVTimperative.g:9308:2: (iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF )
            // InternalQVTimperative.g:9309:2: iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeExpWithoutMultiplicityCS=ruleTypeExpWithoutMultiplicityCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeExpWithoutMultiplicityCS"
    // InternalQVTimperative.g:9316:1: ruleTypeExpWithoutMultiplicityCS returns [EObject current=null] : (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS ) ;
    public final EObject ruleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeNameExpCS_0 = null;

        EObject this_TypeLiteralCS_1 = null;

        EObject this_CollectionPatternCS_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9319:28: ( (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS ) )
            // InternalQVTimperative.g:9320:1: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            {
            // InternalQVTimperative.g:9320:1: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            int alt207=3;
            alt207 = dfa207.predict(input);
            switch (alt207) {
                case 1 :
                    // InternalQVTimperative.g:9321:2: this_TypeNameExpCS_0= ruleTypeNameExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeNameExpCS_0=ruleTypeNameExpCS();

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

                              current = this_TypeNameExpCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9334:2: this_TypeLiteralCS_1= ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeLiteralCS_1=ruleTypeLiteralCS();

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

                              current = this_TypeLiteralCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:9347:2: this_CollectionPatternCS_2= ruleCollectionPatternCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionPatternCS_2=ruleCollectionPatternCS();

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

                              current = this_CollectionPatternCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleTypeExpCS"
    // InternalQVTimperative.g:9366:1: entryRuleTypeExpCS returns [EObject current=null] : iv_ruleTypeExpCS= ruleTypeExpCS EOF ;
    public final EObject entryRuleTypeExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpCS = null;


        try {
            // InternalQVTimperative.g:9367:2: (iv_ruleTypeExpCS= ruleTypeExpCS EOF )
            // InternalQVTimperative.g:9368:2: iv_ruleTypeExpCS= ruleTypeExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeExpCS=ruleTypeExpCS();

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

            }

        }

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


    // $ANTLR start "ruleTypeExpCS"
    // InternalQVTimperative.g:9375:1: ruleTypeExpCS returns [EObject current=null] : (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypeExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeExpWithoutMultiplicityCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9378:28: ( (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTimperative.g:9379:1: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTimperative.g:9379:1: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTimperative.g:9380:2: this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_119);
            this_TypeExpWithoutMultiplicityCS_0=ruleTypeExpWithoutMultiplicityCS();

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

                      current = this_TypeExpWithoutMultiplicityCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalQVTimperative.g:9391:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt208=2;
            int LA208_0 = input.LA(1);

            if ( (LA208_0==151) ) {
                alt208=1;
            }
            switch (alt208) {
                case 1 :
                    // InternalQVTimperative.g:9392:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTimperative.g:9392:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTimperative.g:9393:3: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypeExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedMultiplicity",
                              		lv_ownedMultiplicity_1_0,
                              		"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleExpCS"
    // InternalQVTimperative.g:9417:1: entryRuleExpCS returns [EObject current=null] : iv_ruleExpCS= ruleExpCS EOF ;
    public final EObject entryRuleExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExpCS = null;


        try {
            // InternalQVTimperative.g:9418:2: (iv_ruleExpCS= ruleExpCS EOF )
            // InternalQVTimperative.g:9419:2: iv_ruleExpCS= ruleExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleExpCS=ruleExpCS();

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

            }

        }

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


    // $ANTLR start "ruleExpCS"
    // InternalQVTimperative.g:9426:1: ruleExpCS returns [EObject current=null] : ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS ) ;
    public final EObject ruleExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_PrefixedPrimaryExpCS_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedRight_3_0 = null;

        EObject this_PrefixedLetExpCS_4 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9429:28: ( ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS ) )
            // InternalQVTimperative.g:9430:1: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            {
            // InternalQVTimperative.g:9430:1: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            int alt210=2;
            alt210 = dfa210.predict(input);
            switch (alt210) {
                case 1 :
                    // InternalQVTimperative.g:9430:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTimperative.g:9430:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    // InternalQVTimperative.g:9431:2: this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_135);
                    this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

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

                              current = this_PrefixedPrimaryExpCS_0;
                              afterParserOrEnumRuleCall();

                    }
                    // InternalQVTimperative.g:9442:1: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
                    int alt209=2;
                    int LA209_0 = input.LA(1);

                    if ( (LA209_0==42||LA209_0==53||LA209_0==61||LA209_0==106||(LA209_0>=109 && LA209_0<=126)) ) {
                        alt209=1;
                    }
                    switch (alt209) {
                        case 1 :
                            // InternalQVTimperative.g:9442:2: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                            {
                            // InternalQVTimperative.g:9442:2: ()
                            // InternalQVTimperative.g:9443:2:
                            {
                            if ( state.backtracking==0 ) {

                              	  /* */

                            }
                            if ( state.backtracking==0 ) {

                                      current = forceCreateModelElementAndSet(
                                          grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0(),
                                          current);

                            }

                            }

                            // InternalQVTimperative.g:9451:2: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                            // InternalQVTimperative.g:9452:1: (lv_name_2_0= ruleBinaryOperatorName )
                            {
                            // InternalQVTimperative.g:9452:1: (lv_name_2_0= ruleBinaryOperatorName )
                            // InternalQVTimperative.g:9453:3: lv_name_2_0= ruleBinaryOperatorName
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_8);
                            lv_name_2_0=ruleBinaryOperatorName();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getExpCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"name",
                                      		lv_name_2_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.BinaryOperatorName");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTimperative.g:9469:2: ( (lv_ownedRight_3_0= ruleExpCS ) )
                            // InternalQVTimperative.g:9470:1: (lv_ownedRight_3_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:9470:1: (lv_ownedRight_3_0= ruleExpCS )
                            // InternalQVTimperative.g:9471:3: lv_ownedRight_3_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedRight_3_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getExpCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedRight",
                                      		lv_ownedRight_3_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9489:2: this_PrefixedLetExpCS_4= rulePrefixedLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrefixedLetExpCS_4=rulePrefixedLetExpCS();

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

                              current = this_PrefixedLetExpCS_4;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePrefixedLetExpCS"
    // InternalQVTimperative.g:9508:1: entryRulePrefixedLetExpCS returns [EObject current=null] : iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF ;
    public final EObject entryRulePrefixedLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedLetExpCS = null;


        try {
            // InternalQVTimperative.g:9509:2: (iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF )
            // InternalQVTimperative.g:9510:2: iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrefixedLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrefixedLetExpCS=rulePrefixedLetExpCS();

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

            }

        }

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


    // $ANTLR start "rulePrefixedLetExpCS"
    // InternalQVTimperative.g:9517:1: rulePrefixedLetExpCS returns [EObject current=null] : ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS ) ;
    public final EObject rulePrefixedLetExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedRight_2_0 = null;

        EObject this_LetExpCS_3 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9520:28: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS ) )
            // InternalQVTimperative.g:9521:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            {
            // InternalQVTimperative.g:9521:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            int alt211=2;
            int LA211_0 = input.LA(1);

            if ( ((LA211_0>=106 && LA211_0<=108)) ) {
                alt211=1;
            }
            else if ( (LA211_0==159) ) {
                alt211=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 211, 0, input);

                throw nvae;
            }
            switch (alt211) {
                case 1 :
                    // InternalQVTimperative.g:9521:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    {
                    // InternalQVTimperative.g:9521:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    // InternalQVTimperative.g:9521:3: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    {
                    // InternalQVTimperative.g:9521:3: ()
                    // InternalQVTimperative.g:9522:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0(),
                                  current);

                    }

                    }

                    // InternalQVTimperative.g:9530:2: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalQVTimperative.g:9531:1: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalQVTimperative.g:9531:1: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalQVTimperative.g:9532:3: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_8);
                    lv_name_1_0=ruleUnaryOperatorName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPrefixedLetExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.UnaryOperatorName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:9548:2: ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    // InternalQVTimperative.g:9549:1: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    {
                    // InternalQVTimperative.g:9549:1: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    // InternalQVTimperative.g:9550:3: lv_ownedRight_2_0= rulePrefixedLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedRight_2_0=rulePrefixedLetExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPrefixedLetExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedRight",
                              		lv_ownedRight_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrefixedLetExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9568:2: this_LetExpCS_3= ruleLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LetExpCS_3=ruleLetExpCS();

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

                              current = this_LetExpCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePrefixedPrimaryExpCS"
    // InternalQVTimperative.g:9587:1: entryRulePrefixedPrimaryExpCS returns [EObject current=null] : iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF ;
    public final EObject entryRulePrefixedPrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedPrimaryExpCS = null;


        try {
            // InternalQVTimperative.g:9588:2: (iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF )
            // InternalQVTimperative.g:9589:2: iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrefixedPrimaryExpCS=rulePrefixedPrimaryExpCS();

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

            }

        }

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


    // $ANTLR start "rulePrefixedPrimaryExpCS"
    // InternalQVTimperative.g:9596:1: rulePrefixedPrimaryExpCS returns [EObject current=null] : ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS ) ;
    public final EObject rulePrefixedPrimaryExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedRight_2_0 = null;

        EObject this_PrimaryExpCS_3 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9599:28: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS ) )
            // InternalQVTimperative.g:9600:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            {
            // InternalQVTimperative.g:9600:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            int alt212=2;
            int LA212_0 = input.LA(1);

            if ( ((LA212_0>=106 && LA212_0<=108)) ) {
                alt212=1;
            }
            else if ( (LA212_0==RULE_SINGLE_QUOTED_STRING||(LA212_0>=RULE_INT && LA212_0<=RULE_ESCAPED_ID)||LA212_0==17||LA212_0==19||(LA212_0>=22 && LA212_0<=23)||(LA212_0>=25 && LA212_0<=26)||(LA212_0>=29 && LA212_0<=34)||LA212_0==39||(LA212_0>=42 && LA212_0<=48)||(LA212_0>=50 && LA212_0<=52)||(LA212_0>=54 && LA212_0<=56)||(LA212_0>=58 && LA212_0<=60)||(LA212_0>=62 && LA212_0<=70)||LA212_0==72||LA212_0==74||LA212_0==76||LA212_0==79||LA212_0==81||LA212_0==83||(LA212_0>=85 && LA212_0<=89)||(LA212_0>=91 && LA212_0<=96)||LA212_0==98||LA212_0==100||(LA212_0>=102 && LA212_0<=105)||(LA212_0>=127 && LA212_0<=141)||LA212_0==143||(LA212_0>=145 && LA212_0<=148)||LA212_0==154||LA212_0==160) ) {
                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 :
                    // InternalQVTimperative.g:9600:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    {
                    // InternalQVTimperative.g:9600:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    // InternalQVTimperative.g:9600:3: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    {
                    // InternalQVTimperative.g:9600:3: ()
                    // InternalQVTimperative.g:9601:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0(),
                                  current);

                    }

                    }

                    // InternalQVTimperative.g:9609:2: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalQVTimperative.g:9610:1: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalQVTimperative.g:9610:1: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalQVTimperative.g:9611:3: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_136);
                    lv_name_1_0=ruleUnaryOperatorName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPrefixedPrimaryExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.UnaryOperatorName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:9627:2: ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    // InternalQVTimperative.g:9628:1: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    {
                    // InternalQVTimperative.g:9628:1: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    // InternalQVTimperative.g:9629:3: lv_ownedRight_2_0= rulePrefixedPrimaryExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedRight_2_0=rulePrefixedPrimaryExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPrefixedPrimaryExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedRight",
                              		lv_ownedRight_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrefixedPrimaryExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9647:2: this_PrimaryExpCS_3= rulePrimaryExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimaryExpCS_3=rulePrimaryExpCS();

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

                              current = this_PrimaryExpCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRulePrimaryExpCS"
    // InternalQVTimperative.g:9666:1: entryRulePrimaryExpCS returns [EObject current=null] : iv_rulePrimaryExpCS= rulePrimaryExpCS EOF ;
    public final EObject entryRulePrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimaryExpCS = null;


        try {
            // InternalQVTimperative.g:9667:2: (iv_rulePrimaryExpCS= rulePrimaryExpCS EOF )
            // InternalQVTimperative.g:9668:2: iv_rulePrimaryExpCS= rulePrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimaryExpCS=rulePrimaryExpCS();

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

            }

        }

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


    // $ANTLR start "rulePrimaryExpCS"
    // InternalQVTimperative.g:9675:1: rulePrimaryExpCS returns [EObject current=null] : (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS ) ;
    public final EObject rulePrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_NestedExpCS_0 = null;

        EObject this_IfExpCS_1 = null;

        EObject this_SelfExpCS_2 = null;

        EObject this_PrimitiveLiteralExpCS_3 = null;

        EObject this_TupleLiteralExpCS_4 = null;

        EObject this_MapLiteralExpCS_5 = null;

        EObject this_CollectionLiteralExpCS_6 = null;

        EObject this_LambdaLiteralExpCS_7 = null;

        EObject this_TypeLiteralExpCS_8 = null;

        EObject this_NameExpCS_9 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9678:28: ( (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS ) )
            // InternalQVTimperative.g:9679:1: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )
            {
            // InternalQVTimperative.g:9679:1: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )
            int alt213=10;
            alt213 = dfa213.predict(input);
            switch (alt213) {
                case 1 :
                    // InternalQVTimperative.g:9680:2: this_NestedExpCS_0= ruleNestedExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NestedExpCS_0=ruleNestedExpCS();

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

                              current = this_NestedExpCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:9693:2: this_IfExpCS_1= ruleIfExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_IfExpCS_1=ruleIfExpCS();

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

                              current = this_IfExpCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:9706:2: this_SelfExpCS_2= ruleSelfExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SelfExpCS_2=ruleSelfExpCS();

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

                              current = this_SelfExpCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTimperative.g:9719:2: this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveLiteralExpCS_3=rulePrimitiveLiteralExpCS();

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

                              current = this_PrimitiveLiteralExpCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTimperative.g:9732:2: this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TupleLiteralExpCS_4=ruleTupleLiteralExpCS();

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

                              current = this_TupleLiteralExpCS_4;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTimperative.g:9745:2: this_MapLiteralExpCS_5= ruleMapLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MapLiteralExpCS_5=ruleMapLiteralExpCS();

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

                              current = this_MapLiteralExpCS_5;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTimperative.g:9758:2: this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionLiteralExpCS_6=ruleCollectionLiteralExpCS();

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

                              current = this_CollectionLiteralExpCS_6;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTimperative.g:9771:2: this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LambdaLiteralExpCS_7=ruleLambdaLiteralExpCS();

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

                              current = this_LambdaLiteralExpCS_7;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTimperative.g:9784:2: this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeLiteralExpCS_8=ruleTypeLiteralExpCS();

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

                              current = this_TypeLiteralExpCS_8;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTimperative.g:9797:2: this_NameExpCS_9= ruleNameExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NameExpCS_9=ruleNameExpCS();

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

                              current = this_NameExpCS_9;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNameExpCS"
    // InternalQVTimperative.g:9816:1: entryRuleNameExpCS returns [EObject current=null] : iv_ruleNameExpCS= ruleNameExpCS EOF ;
    public final EObject entryRuleNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNameExpCS = null;


        try {
            // InternalQVTimperative.g:9817:2: (iv_ruleNameExpCS= ruleNameExpCS EOF )
            // InternalQVTimperative.g:9818:2: iv_ruleNameExpCS= ruleNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNameExpCS=ruleNameExpCS();

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

            }

        }

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


    // $ANTLR start "ruleNameExpCS"
    // InternalQVTimperative.g:9825:1: ruleNameExpCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? ) ;
    public final EObject ruleNameExpCS() throws RecognitionException {
        EObject current = null;

        Token lv_isPre_4_0=null;
        Token otherlv_5=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedSquareBracketedClauses_1_0 = null;

        EObject lv_ownedRoundBracketedClause_2_0 = null;

        EObject lv_ownedCurlyBracketedClause_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9828:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? ) )
            // InternalQVTimperative.g:9829:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? )
            {
            // InternalQVTimperative.g:9829:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? )
            // InternalQVTimperative.g:9829:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )?
            {
            // InternalQVTimperative.g:9829:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTimperative.g:9830:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTimperative.g:9830:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTimperative.g:9831:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_137);
            lv_ownedPathName_0_0=rulePathNameCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNameExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPathName",
                      		lv_ownedPathName_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:9847:2: ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )*
            loop214:
            do {
                int alt214=2;
                int LA214_0 = input.LA(1);

                if ( (LA214_0==151) ) {
                    alt214=1;
                }


                switch (alt214) {
            	case 1 :
            	    // InternalQVTimperative.g:9848:1: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    {
            	    // InternalQVTimperative.g:9848:1: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    // InternalQVTimperative.g:9849:3: lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_137);
            	    lv_ownedSquareBracketedClauses_1_0=ruleSquareBracketedClauseCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getNameExpCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedSquareBracketedClauses",
            	              		lv_ownedSquareBracketedClauses_1_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.SquareBracketedClauseCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalQVTimperative.g:9865:3: ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )?
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==56) ) {
                alt215=1;
            }
            switch (alt215) {
                case 1 :
                    // InternalQVTimperative.g:9866:1: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalQVTimperative.g:9866:1: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    // InternalQVTimperative.g:9867:3: lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_138);
                    lv_ownedRoundBracketedClause_2_0=ruleRoundBracketedClauseCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNameExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedRoundBracketedClause",
                              		lv_ownedRoundBracketedClause_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.RoundBracketedClauseCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:9883:3: ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )?
            int alt216=2;
            alt216 = dfa216.predict(input);
            switch (alt216) {
                case 1 :
                    // InternalQVTimperative.g:9884:1: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalQVTimperative.g:9884:1: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    // InternalQVTimperative.g:9885:3: lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_139);
                    lv_ownedCurlyBracketedClause_3_0=ruleCurlyBracketedClauseCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNameExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedCurlyBracketedClause",
                              		lv_ownedCurlyBracketedClause_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CurlyBracketedClauseCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:9901:3: ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )?
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==149) ) {
                alt217=1;
            }
            switch (alt217) {
                case 1 :
                    // InternalQVTimperative.g:9901:4: ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre'
                    {
                    // InternalQVTimperative.g:9901:4: ( (lv_isPre_4_0= '@' ) )
                    // InternalQVTimperative.g:9902:1: (lv_isPre_4_0= '@' )
                    {
                    // InternalQVTimperative.g:9902:1: (lv_isPre_4_0= '@' )
                    // InternalQVTimperative.g:9903:3: lv_isPre_4_0= '@'
                    {
                    lv_isPre_4_0=(Token)match(input,149,FollowSets000.FOLLOW_140); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isPre_4_0, grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getNameExpCSRule());
                      	        }
                             		setWithLastConsumed(current, "isPre", true, "@");

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_5, grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCurlyBracketedClauseCS"
    // InternalQVTimperative.g:9928:1: entryRuleCurlyBracketedClauseCS returns [EObject current=null] : iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF ;
    public final EObject entryRuleCurlyBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCurlyBracketedClauseCS = null;


        try {
            // InternalQVTimperative.g:9929:2: (iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF )
            // InternalQVTimperative.g:9930:2: iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCurlyBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCurlyBracketedClauseCS=ruleCurlyBracketedClauseCS();

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

            }

        }

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


    // $ANTLR start "ruleCurlyBracketedClauseCS"
    // InternalQVTimperative.g:9937:1: ruleCurlyBracketedClauseCS returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleCurlyBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:9940:28: ( ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTimperative.g:9941:1: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTimperative.g:9941:1: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTimperative.g:9941:2: () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTimperative.g:9941:2: ()
            // InternalQVTimperative.g:9942:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTimperative.g:9954:1: ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==RULE_SINGLE_QUOTED_STRING||(LA219_0>=RULE_SIMPLE_ID && LA219_0<=RULE_ESCAPED_ID)||LA219_0==17||LA219_0==19||(LA219_0>=22 && LA219_0<=23)||(LA219_0>=25 && LA219_0<=26)||(LA219_0>=29 && LA219_0<=34)||LA219_0==39||(LA219_0>=43 && LA219_0<=48)||(LA219_0>=50 && LA219_0<=52)||(LA219_0>=54 && LA219_0<=55)||(LA219_0>=58 && LA219_0<=60)||(LA219_0>=62 && LA219_0<=70)||LA219_0==72||LA219_0==74||LA219_0==76||LA219_0==79||LA219_0==81||LA219_0==83||(LA219_0>=85 && LA219_0<=89)||(LA219_0>=91 && LA219_0<=96)||LA219_0==98||LA219_0==100||(LA219_0>=102 && LA219_0<=105)) ) {
                alt219=1;
            }
            switch (alt219) {
                case 1 :
                    // InternalQVTimperative.g:9954:2: ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    {
                    // InternalQVTimperative.g:9954:2: ( (lv_ownedParts_2_0= ruleShadowPartCS ) )
                    // InternalQVTimperative.g:9955:1: (lv_ownedParts_2_0= ruleShadowPartCS )
                    {
                    // InternalQVTimperative.g:9955:1: (lv_ownedParts_2_0= ruleShadowPartCS )
                    // InternalQVTimperative.g:9956:3: lv_ownedParts_2_0= ruleShadowPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_112);
                    lv_ownedParts_2_0=ruleShadowPartCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCurlyBracketedClauseCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedParts",
                              		lv_ownedParts_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ShadowPartCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:9972:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    loop218:
                    do {
                        int alt218=2;
                        int LA218_0 = input.LA(1);

                        if ( (LA218_0==18) ) {
                            alt218=1;
                        }


                        switch (alt218) {
                    	case 1 :
                    	    // InternalQVTimperative.g:9972:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_36); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTimperative.g:9976:1: ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    // InternalQVTimperative.g:9977:1: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    {
                    	    // InternalQVTimperative.g:9977:1: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    // InternalQVTimperative.g:9978:3: lv_ownedParts_4_0= ruleShadowPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_112);
                    	    lv_ownedParts_4_0=ruleShadowPartCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getCurlyBracketedClauseCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedParts",
                    	              		lv_ownedParts_4_0,
                    	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ShadowPartCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleRoundBracketedClauseCS"
    // InternalQVTimperative.g:10006:1: entryRuleRoundBracketedClauseCS returns [EObject current=null] : iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF ;
    public final EObject entryRuleRoundBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRoundBracketedClauseCS = null;


        try {
            // InternalQVTimperative.g:10007:2: (iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF )
            // InternalQVTimperative.g:10008:2: iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRoundBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRoundBracketedClauseCS=ruleRoundBracketedClauseCS();

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

            }

        }

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


    // $ANTLR start "ruleRoundBracketedClauseCS"
    // InternalQVTimperative.g:10015:1: ruleRoundBracketedClauseCS returns [EObject current=null] : ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' ) ;
    public final EObject ruleRoundBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        EObject lv_ownedArguments_2_0 = null;

        EObject lv_ownedArguments_3_1 = null;

        EObject lv_ownedArguments_3_2 = null;

        EObject lv_ownedArguments_3_3 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10018:28: ( ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' ) )
            // InternalQVTimperative.g:10019:1: ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' )
            {
            // InternalQVTimperative.g:10019:1: ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' )
            // InternalQVTimperative.g:10019:2: () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')'
            {
            // InternalQVTimperative.g:10019:2: ()
            // InternalQVTimperative.g:10020:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());

            }
            // InternalQVTimperative.g:10032:1: ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==RULE_SINGLE_QUOTED_STRING||(LA222_0>=RULE_INT && LA222_0<=RULE_ESCAPED_ID)||LA222_0==17||LA222_0==19||(LA222_0>=22 && LA222_0<=26)||(LA222_0>=29 && LA222_0<=34)||LA222_0==39||(LA222_0>=42 && LA222_0<=48)||(LA222_0>=50 && LA222_0<=52)||(LA222_0>=54 && LA222_0<=56)||(LA222_0>=58 && LA222_0<=60)||(LA222_0>=62 && LA222_0<=70)||LA222_0==72||LA222_0==74||LA222_0==76||LA222_0==79||LA222_0==81||LA222_0==83||(LA222_0>=85 && LA222_0<=89)||(LA222_0>=91 && LA222_0<=96)||LA222_0==98||LA222_0==100||(LA222_0>=102 && LA222_0<=108)||(LA222_0>=127 && LA222_0<=141)||LA222_0==143||(LA222_0>=145 && LA222_0<=148)||LA222_0==154||(LA222_0>=159 && LA222_0<=160)) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // InternalQVTimperative.g:10032:2: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    {
                    // InternalQVTimperative.g:10032:2: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) )
                    // InternalQVTimperative.g:10033:1: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    {
                    // InternalQVTimperative.g:10033:1: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    // InternalQVTimperative.g:10034:3: lv_ownedArguments_2_0= ruleNavigatingArgCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_143);
                    lv_ownedArguments_2_0=ruleNavigatingArgCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedArguments",
                              		lv_ownedArguments_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10050:2: ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    loop221:
                    do {
                        int alt221=2;
                        int LA221_0 = input.LA(1);

                        if ( (LA221_0==18||LA221_0==21||LA221_0==153) ) {
                            alt221=1;
                        }


                        switch (alt221) {
                    	case 1 :
                    	    // InternalQVTimperative.g:10051:1: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    {
                    	    // InternalQVTimperative.g:10051:1: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    // InternalQVTimperative.g:10052:1: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    {
                    	    // InternalQVTimperative.g:10052:1: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    int alt220=3;
                    	    switch ( input.LA(1) ) {
                    	    case 18:
                    	        {
                    	        alt220=1;
                    	        }
                    	        break;
                    	    case 21:
                    	        {
                    	        alt220=2;
                    	        }
                    	        break;
                    	    case 153:
                    	        {
                    	        alt220=3;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 220, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt220) {
                    	        case 1 :
                    	            // InternalQVTimperative.g:10053:3: lv_ownedArguments_3_1= ruleNavigatingCommaArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_143);
                    	            lv_ownedArguments_3_1=ruleNavigatingCommaArgCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedArguments",
                    	                      		lv_ownedArguments_3_1,
                    	                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingCommaArgCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTimperative.g:10068:8: lv_ownedArguments_3_2= ruleNavigatingSemiArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_143);
                    	            lv_ownedArguments_3_2=ruleNavigatingSemiArgCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedArguments",
                    	                      		lv_ownedArguments_3_2,
                    	                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingSemiArgCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTimperative.g:10083:8: lv_ownedArguments_3_3= ruleNavigatingBarArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_143);
                    	            lv_ownedArguments_3_3=ruleNavigatingBarArgCS();

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

                    	              	        if (current==null) {
                    	              	            current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              	        }
                    	                     		add(
                    	                     			current,
                    	                     			"ownedArguments",
                    	                      		lv_ownedArguments_3_3,
                    	                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingBarArgCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_4=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleSquareBracketedClauseCS"
    // InternalQVTimperative.g:10113:1: entryRuleSquareBracketedClauseCS returns [EObject current=null] : iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF ;
    public final EObject entryRuleSquareBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSquareBracketedClauseCS = null;


        try {
            // InternalQVTimperative.g:10114:2: (iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF )
            // InternalQVTimperative.g:10115:2: iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSquareBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSquareBracketedClauseCS=ruleSquareBracketedClauseCS();

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

            }

        }

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


    // $ANTLR start "ruleSquareBracketedClauseCS"
    // InternalQVTimperative.g:10122:1: ruleSquareBracketedClauseCS returns [EObject current=null] : (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' ) ;
    public final EObject ruleSquareBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedTerms_1_0 = null;

        EObject lv_ownedTerms_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10125:28: ( (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' ) )
            // InternalQVTimperative.g:10126:1: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            {
            // InternalQVTimperative.g:10126:1: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            // InternalQVTimperative.g:10126:3: otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']'
            {
            otherlv_0=(Token)match(input,151,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalQVTimperative.g:10130:1: ( (lv_ownedTerms_1_0= ruleExpCS ) )
            // InternalQVTimperative.g:10131:1: (lv_ownedTerms_1_0= ruleExpCS )
            {
            // InternalQVTimperative.g:10131:1: (lv_ownedTerms_1_0= ruleExpCS )
            // InternalQVTimperative.g:10132:3: lv_ownedTerms_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_144);
            lv_ownedTerms_1_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getSquareBracketedClauseCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedTerms",
                      		lv_ownedTerms_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:10148:2: (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )*
            loop223:
            do {
                int alt223=2;
                int LA223_0 = input.LA(1);

                if ( (LA223_0==18) ) {
                    alt223=1;
                }


                switch (alt223) {
            	case 1 :
            	    // InternalQVTimperative.g:10148:4: otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    {
            	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTimperative.g:10152:1: ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    // InternalQVTimperative.g:10153:1: (lv_ownedTerms_3_0= ruleExpCS )
            	    {
            	    // InternalQVTimperative.g:10153:1: (lv_ownedTerms_3_0= ruleExpCS )
            	    // InternalQVTimperative.g:10154:3: lv_ownedTerms_3_0= ruleExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_144);
            	    lv_ownedTerms_3_0=ruleExpCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getSquareBracketedClauseCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedTerms",
            	              		lv_ownedTerms_3_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,152,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigatingArgCS"
    // InternalQVTimperative.g:10182:1: entryRuleNavigatingArgCS returns [EObject current=null] : iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF ;
    public final EObject entryRuleNavigatingArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgCS = null;


        try {
            // InternalQVTimperative.g:10183:2: (iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF )
            // InternalQVTimperative.g:10184:2: iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingArgCS=ruleNavigatingArgCS();

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

            }

        }

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


    // $ANTLR start "ruleNavigatingArgCS"
    // InternalQVTimperative.g:10191:1: ruleNavigatingArgCS returns [EObject current=null] : ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) ) ;
    public final EObject ruleNavigatingArgCS() 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;
        Token otherlv_15=null;
        Token otherlv_17=null;
        EObject lv_ownedNameExpression_0_0 = null;

        EObject lv_ownedCoIterator_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;

        EObject lv_ownedType_6_0 = null;

        EObject lv_ownedCoIterator_8_0 = null;

        EObject lv_ownedInitExpression_10_0 = null;

        EObject lv_ownedType_12_0 = null;

        EObject lv_ownedCoIterator_14_0 = null;

        EObject lv_ownedInitExpression_16_0 = null;

        EObject lv_ownedType_18_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10194:28: ( ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) ) )
            // InternalQVTimperative.g:10195:1: ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) )
            {
            // InternalQVTimperative.g:10195:1: ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) )
            int alt230=2;
            int LA230_0 = input.LA(1);

            if ( (LA230_0==RULE_SINGLE_QUOTED_STRING||(LA230_0>=RULE_INT && LA230_0<=RULE_ESCAPED_ID)||LA230_0==17||LA230_0==19||(LA230_0>=22 && LA230_0<=23)||(LA230_0>=25 && LA230_0<=26)||(LA230_0>=29 && LA230_0<=34)||LA230_0==39||(LA230_0>=42 && LA230_0<=48)||(LA230_0>=50 && LA230_0<=52)||(LA230_0>=54 && LA230_0<=56)||(LA230_0>=58 && LA230_0<=60)||(LA230_0>=62 && LA230_0<=70)||LA230_0==72||LA230_0==74||LA230_0==76||LA230_0==79||LA230_0==81||LA230_0==83||(LA230_0>=85 && LA230_0<=89)||(LA230_0>=91 && LA230_0<=96)||LA230_0==98||LA230_0==100||(LA230_0>=102 && LA230_0<=108)||(LA230_0>=127 && LA230_0<=141)||LA230_0==143||(LA230_0>=145 && LA230_0<=148)||LA230_0==154||(LA230_0>=159 && LA230_0<=160)) ) {
                alt230=1;
            }
            else if ( (LA230_0==24) ) {
                alt230=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 230, 0, input);

                throw nvae;
            }
            switch (alt230) {
                case 1 :
                    // InternalQVTimperative.g:10195:2: ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? )
                    {
                    // InternalQVTimperative.g:10195:2: ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? )
                    // InternalQVTimperative.g:10195:3: ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?
                    {
                    // InternalQVTimperative.g:10195:3: ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) )
                    // InternalQVTimperative.g:10196:1: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    {
                    // InternalQVTimperative.g:10196:1: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    // InternalQVTimperative.g:10197:3: lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_145);
                    lv_ownedNameExpression_0_0=ruleNavigatingArgExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedNameExpression",
                              		lv_ownedNameExpression_0_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10213:2: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?
                    int alt229=4;
                    alt229 = dfa229.predict(input);
                    switch (alt229) {
                        case 1 :
                            // InternalQVTimperative.g:10213:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            {
                            // InternalQVTimperative.g:10213:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            // InternalQVTimperative.g:10213:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            {
                            otherlv_1=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_1, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());

                            }
                            // InternalQVTimperative.g:10217:1: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTimperative.g:10218:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTimperative.g:10218:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            // InternalQVTimperative.g:10219:3: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_146);
                            lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedCoIterator",
                                      		lv_ownedCoIterator_2_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTimperative.g:10235:2: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            int alt224=2;
                            int LA224_0 = input.LA(1);

                            if ( (LA224_0==53) ) {
                                alt224=1;
                            }
                            switch (alt224) {
                                case 1 :
                                    // InternalQVTimperative.g:10235:4: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    {
                                    otherlv_3=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_3, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());

                                    }
                                    // InternalQVTimperative.g:10239:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    // InternalQVTimperative.g:10240:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    {
                                    // InternalQVTimperative.g:10240:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    // InternalQVTimperative.g:10241:3: lv_ownedInitExpression_4_0= ruleExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_ownedInitExpression_4_0=ruleExpCS();

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

                                      	        if (current==null) {
                                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      	        }
                                             		set(
                                             			current,
                                             			"ownedInitExpression",
                                              		lv_ownedInitExpression_4_0,
                                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTimperative.g:10258:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            {
                            // InternalQVTimperative.g:10258:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            // InternalQVTimperative.g:10258:8: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                            {
                            otherlv_5=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_5, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());

                            }
                            // InternalQVTimperative.g:10262:1: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
                            // InternalQVTimperative.g:10263:1: (lv_ownedType_6_0= ruleTypeExpCS )
                            {
                            // InternalQVTimperative.g:10263:1: (lv_ownedType_6_0= ruleTypeExpCS )
                            // InternalQVTimperative.g:10264:3: lv_ownedType_6_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_147);
                            lv_ownedType_6_0=ruleTypeExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedType",
                                      		lv_ownedType_6_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTimperative.g:10280:2: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
                            int alt225=2;
                            int LA225_0 = input.LA(1);

                            if ( (LA225_0==144) ) {
                                alt225=1;
                            }
                            switch (alt225) {
                                case 1 :
                                    // InternalQVTimperative.g:10280:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_7=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_7, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());

                                    }
                                    // InternalQVTimperative.g:10284:1: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    // InternalQVTimperative.g:10285:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalQVTimperative.g:10285:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    // InternalQVTimperative.g:10286:3: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_146);
                                    lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();

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

                                      	        if (current==null) {
                                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      	        }
                                             		set(
                                             			current,
                                             			"ownedCoIterator",
                                              		lv_ownedCoIterator_8_0,
                                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalQVTimperative.g:10302:4: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                            int alt226=2;
                            int LA226_0 = input.LA(1);

                            if ( (LA226_0==53) ) {
                                alt226=1;
                            }
                            switch (alt226) {
                                case 1 :
                                    // InternalQVTimperative.g:10302:6: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    {
                                    otherlv_9=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_9, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());

                                    }
                                    // InternalQVTimperative.g:10306:1: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    // InternalQVTimperative.g:10307:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    {
                                    // InternalQVTimperative.g:10307:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    // InternalQVTimperative.g:10308:3: lv_ownedInitExpression_10_0= ruleExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_ownedInitExpression_10_0=ruleExpCS();

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

                                      	        if (current==null) {
                                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      	        }
                                             		set(
                                             			current,
                                             			"ownedInitExpression",
                                              		lv_ownedInitExpression_10_0,
                                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalQVTimperative.g:10325:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            {
                            // InternalQVTimperative.g:10325:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            // InternalQVTimperative.g:10325:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            {
                            // InternalQVTimperative.g:10325:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
                            int alt227=2;
                            int LA227_0 = input.LA(1);

                            if ( (LA227_0==24) ) {
                                alt227=1;
                            }
                            switch (alt227) {
                                case 1 :
                                    // InternalQVTimperative.g:10325:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    {
                                    otherlv_11=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_11, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());

                                    }
                                    // InternalQVTimperative.g:10329:1: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    // InternalQVTimperative.g:10330:1: (lv_ownedType_12_0= ruleTypeExpCS )
                                    {
                                    // InternalQVTimperative.g:10330:1: (lv_ownedType_12_0= ruleTypeExpCS )
                                    // InternalQVTimperative.g:10331:3: lv_ownedType_12_0= ruleTypeExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_148);
                                    lv_ownedType_12_0=ruleTypeExpCS();

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

                                      	        if (current==null) {
                                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      	        }
                                             		set(
                                             			current,
                                             			"ownedType",
                                              		lv_ownedType_12_0,
                                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalQVTimperative.g:10347:4: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
                            int alt228=2;
                            int LA228_0 = input.LA(1);

                            if ( (LA228_0==144) ) {
                                alt228=1;
                            }
                            switch (alt228) {
                                case 1 :
                                    // InternalQVTimperative.g:10347:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_13=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_13, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());

                                    }
                                    // InternalQVTimperative.g:10351:1: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    // InternalQVTimperative.g:10352:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalQVTimperative.g:10352:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    // InternalQVTimperative.g:10353:3: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_44);
                                    lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();

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

                                      	        if (current==null) {
                                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      	        }
                                             		set(
                                             			current,
                                             			"ownedCoIterator",
                                              		lv_ownedCoIterator_14_0,
                                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                                      	        afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            otherlv_15=(Token)match(input,49,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_15, grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());

                            }
                            // InternalQVTimperative.g:10373:1: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            // InternalQVTimperative.g:10374:1: (lv_ownedInitExpression_16_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:10374:1: (lv_ownedInitExpression_16_0= ruleExpCS )
                            // InternalQVTimperative.g:10375:3: lv_ownedInitExpression_16_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_16_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_16_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:10392:6: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    {
                    // InternalQVTimperative.g:10392:6: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    // InternalQVTimperative.g:10392:8: otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    {
                    otherlv_17=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_17, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTimperative.g:10396:1: ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:10397:1: (lv_ownedType_18_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:10397:1: (lv_ownedType_18_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:10398:3: lv_ownedType_18_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedType_18_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_18_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigatingBarArgCS"
    // InternalQVTimperative.g:10422:1: entryRuleNavigatingBarArgCS returns [EObject current=null] : iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF ;
    public final EObject entryRuleNavigatingBarArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingBarArgCS = null;


        try {
            // InternalQVTimperative.g:10423:2: (iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF )
            // InternalQVTimperative.g:10424:2: iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingBarArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingBarArgCS=ruleNavigatingBarArgCS();

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

            }

        }

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


    // $ANTLR start "ruleNavigatingBarArgCS"
    // InternalQVTimperative.g:10431:1: ruleNavigatingBarArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) ;
    public final EObject ruleNavigatingBarArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10434:28: ( ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalQVTimperative.g:10435:1: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalQVTimperative.g:10435:1: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalQVTimperative.g:10435:2: ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalQVTimperative.g:10435:2: ( (lv_prefix_0_0= '|' ) )
            // InternalQVTimperative.g:10436:1: (lv_prefix_0_0= '|' )
            {
            // InternalQVTimperative.g:10436:1: (lv_prefix_0_0= '|' )
            // InternalQVTimperative.g:10437:3: lv_prefix_0_0= '|'
            {
            lv_prefix_0_0=(Token)match(input,153,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNavigatingBarArgCSRule());
              	        }
                     		setWithLastConsumed(current, "prefix", lv_prefix_0_0, "|");

            }

            }


            }

            // InternalQVTimperative.g:10450:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTimperative.g:10451:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTimperative.g:10451:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTimperative.g:10452:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_46);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedNameExpression",
                      		lv_ownedNameExpression_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:10468:2: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt232=2;
            int LA232_0 = input.LA(1);

            if ( (LA232_0==24) ) {
                alt232=1;
            }
            switch (alt232) {
                case 1 :
                    // InternalQVTimperative.g:10468:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTimperative.g:10472:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:10473:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:10473:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:10474:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_146);
                    lv_ownedType_3_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10490:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt231=2;
                    int LA231_0 = input.LA(1);

                    if ( (LA231_0==53) ) {
                        alt231=1;
                    }
                    switch (alt231) {
                        case 1 :
                            // InternalQVTimperative.g:10490:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalQVTimperative.g:10494:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTimperative.g:10495:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:10495:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTimperative.g:10496:3: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_5_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigatingCommaArgCS"
    // InternalQVTimperative.g:10520:1: entryRuleNavigatingCommaArgCS returns [EObject current=null] : iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF ;
    public final EObject entryRuleNavigatingCommaArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingCommaArgCS = null;


        try {
            // InternalQVTimperative.g:10521:2: (iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF )
            // InternalQVTimperative.g:10522:2: iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingCommaArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingCommaArgCS=ruleNavigatingCommaArgCS();

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

            }

        }

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


    // $ANTLR start "ruleNavigatingCommaArgCS"
    // InternalQVTimperative.g:10529:1: ruleNavigatingCommaArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? ) ;
    public final EObject ruleNavigatingCommaArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=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_14=null;
        Token otherlv_16=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedCoIterator_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;

        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedCoIterator_9_0 = null;

        EObject lv_ownedInitExpression_11_0 = null;

        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedCoIterator_15_0 = null;

        EObject lv_ownedInitExpression_17_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10532:28: ( ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? ) )
            // InternalQVTimperative.g:10533:1: ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? )
            {
            // InternalQVTimperative.g:10533:1: ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? )
            // InternalQVTimperative.g:10533:2: ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?
            {
            // InternalQVTimperative.g:10533:2: ( (lv_prefix_0_0= ',' ) )
            // InternalQVTimperative.g:10534:1: (lv_prefix_0_0= ',' )
            {
            // InternalQVTimperative.g:10534:1: (lv_prefix_0_0= ',' )
            // InternalQVTimperative.g:10535:3: lv_prefix_0_0= ','
            {
            lv_prefix_0_0=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNavigatingCommaArgCSRule());
              	        }
                     		setWithLastConsumed(current, "prefix", lv_prefix_0_0, ",");

            }

            }


            }

            // InternalQVTimperative.g:10548:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTimperative.g:10549:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTimperative.g:10549:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTimperative.g:10550:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_145);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedNameExpression",
                      		lv_ownedNameExpression_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:10566:2: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?
            int alt238=4;
            alt238 = dfa238.predict(input);
            switch (alt238) {
                case 1 :
                    // InternalQVTimperative.g:10566:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTimperative.g:10566:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    // InternalQVTimperative.g:10566:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());

                    }
                    // InternalQVTimperative.g:10570:1: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
                    // InternalQVTimperative.g:10571:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    {
                    // InternalQVTimperative.g:10571:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    // InternalQVTimperative.g:10572:3: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_146);
                    lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedCoIterator",
                              		lv_ownedCoIterator_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10588:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt233=2;
                    int LA233_0 = input.LA(1);

                    if ( (LA233_0==53) ) {
                        alt233=1;
                    }
                    switch (alt233) {
                        case 1 :
                            // InternalQVTimperative.g:10588:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());

                            }
                            // InternalQVTimperative.g:10592:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTimperative.g:10593:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:10593:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTimperative.g:10594:3: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_5_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:10611:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTimperative.g:10611:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    // InternalQVTimperative.g:10611:8: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                    {
                    otherlv_6=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());

                    }
                    // InternalQVTimperative.g:10615:1: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:10616:1: (lv_ownedType_7_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:10616:1: (lv_ownedType_7_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:10617:3: lv_ownedType_7_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_147);
                    lv_ownedType_7_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_7_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10633:2: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
                    int alt234=2;
                    int LA234_0 = input.LA(1);

                    if ( (LA234_0==144) ) {
                        alt234=1;
                    }
                    switch (alt234) {
                        case 1 :
                            // InternalQVTimperative.g:10633:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_8=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_8, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());

                            }
                            // InternalQVTimperative.g:10637:1: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTimperative.g:10638:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTimperative.g:10638:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            // InternalQVTimperative.g:10639:3: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_146);
                            lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedCoIterator",
                                      		lv_ownedCoIterator_9_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalQVTimperative.g:10655:4: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                    int alt235=2;
                    int LA235_0 = input.LA(1);

                    if ( (LA235_0==53) ) {
                        alt235=1;
                    }
                    switch (alt235) {
                        case 1 :
                            // InternalQVTimperative.g:10655:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            {
                            otherlv_10=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_10, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());

                            }
                            // InternalQVTimperative.g:10659:1: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            // InternalQVTimperative.g:10660:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:10660:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                            // InternalQVTimperative.g:10661:3: lv_ownedInitExpression_11_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_11_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_11_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:10678:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    {
                    // InternalQVTimperative.g:10678:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    // InternalQVTimperative.g:10678:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    {
                    // InternalQVTimperative.g:10678:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
                    int alt236=2;
                    int LA236_0 = input.LA(1);

                    if ( (LA236_0==24) ) {
                        alt236=1;
                    }
                    switch (alt236) {
                        case 1 :
                            // InternalQVTimperative.g:10678:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            {
                            otherlv_12=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_12, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());

                            }
                            // InternalQVTimperative.g:10682:1: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            // InternalQVTimperative.g:10683:1: (lv_ownedType_13_0= ruleTypeExpCS )
                            {
                            // InternalQVTimperative.g:10683:1: (lv_ownedType_13_0= ruleTypeExpCS )
                            // InternalQVTimperative.g:10684:3: lv_ownedType_13_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_148);
                            lv_ownedType_13_0=ruleTypeExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedType",
                                      		lv_ownedType_13_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalQVTimperative.g:10700:4: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
                    int alt237=2;
                    int LA237_0 = input.LA(1);

                    if ( (LA237_0==144) ) {
                        alt237=1;
                    }
                    switch (alt237) {
                        case 1 :
                            // InternalQVTimperative.g:10700:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_14=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_14, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());

                            }
                            // InternalQVTimperative.g:10704:1: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTimperative.g:10705:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTimperative.g:10705:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            // InternalQVTimperative.g:10706:3: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_44);
                            lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedCoIterator",
                                      		lv_ownedCoIterator_15_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_16=(Token)match(input,49,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_16, grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());

                    }
                    // InternalQVTimperative.g:10726:1: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    // InternalQVTimperative.g:10727:1: (lv_ownedInitExpression_17_0= ruleExpCS )
                    {
                    // InternalQVTimperative.g:10727:1: (lv_ownedInitExpression_17_0= ruleExpCS )
                    // InternalQVTimperative.g:10728:3: lv_ownedInitExpression_17_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedInitExpression_17_0=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedInitExpression",
                              		lv_ownedInitExpression_17_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigatingSemiArgCS"
    // InternalQVTimperative.g:10752:1: entryRuleNavigatingSemiArgCS returns [EObject current=null] : iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF ;
    public final EObject entryRuleNavigatingSemiArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingSemiArgCS = null;


        try {
            // InternalQVTimperative.g:10753:2: (iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF )
            // InternalQVTimperative.g:10754:2: iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingSemiArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingSemiArgCS=ruleNavigatingSemiArgCS();

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

            }

        }

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


    // $ANTLR start "ruleNavigatingSemiArgCS"
    // InternalQVTimperative.g:10761:1: ruleNavigatingSemiArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) ;
    public final EObject ruleNavigatingSemiArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10764:28: ( ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalQVTimperative.g:10765:1: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalQVTimperative.g:10765:1: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalQVTimperative.g:10765:2: ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalQVTimperative.g:10765:2: ( (lv_prefix_0_0= ';' ) )
            // InternalQVTimperative.g:10766:1: (lv_prefix_0_0= ';' )
            {
            // InternalQVTimperative.g:10766:1: (lv_prefix_0_0= ';' )
            // InternalQVTimperative.g:10767:3: lv_prefix_0_0= ';'
            {
            lv_prefix_0_0=(Token)match(input,21,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNavigatingSemiArgCSRule());
              	        }
                     		setWithLastConsumed(current, "prefix", lv_prefix_0_0, ";");

            }

            }


            }

            // InternalQVTimperative.g:10780:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTimperative.g:10781:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTimperative.g:10781:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTimperative.g:10782:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_46);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedNameExpression",
                      		lv_ownedNameExpression_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:10798:2: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt240=2;
            int LA240_0 = input.LA(1);

            if ( (LA240_0==24) ) {
                alt240=1;
            }
            switch (alt240) {
                case 1 :
                    // InternalQVTimperative.g:10798:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTimperative.g:10802:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:10803:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:10803:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:10804:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_146);
                    lv_ownedType_3_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:10820:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt239=2;
                    int LA239_0 = input.LA(1);

                    if ( (LA239_0==53) ) {
                        alt239=1;
                    }
                    switch (alt239) {
                        case 1 :
                            // InternalQVTimperative.g:10820:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalQVTimperative.g:10824:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTimperative.g:10825:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTimperative.g:10825:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTimperative.g:10826:3: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedInitExpression",
                                      		lv_ownedInitExpression_5_0,
                                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleNavigatingArgExpCS"
    // InternalQVTimperative.g:10850:1: entryRuleNavigatingArgExpCS returns [EObject current=null] : iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF ;
    public final EObject entryRuleNavigatingArgExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgExpCS = null;


        try {
            // InternalQVTimperative.g:10851:2: (iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF )
            // InternalQVTimperative.g:10852:2: iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingArgExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingArgExpCS=ruleNavigatingArgExpCS();

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

            }

        }

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


    // $ANTLR start "ruleNavigatingArgExpCS"
    // InternalQVTimperative.g:10859:1: ruleNavigatingArgExpCS returns [EObject current=null] : this_ExpCS_0= ruleExpCS ;
    public final EObject ruleNavigatingArgExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_ExpCS_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10862:28: (this_ExpCS_0= ruleExpCS )
            // InternalQVTimperative.g:10864:2: this_ExpCS_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getNavigatingArgExpCSAccess().getExpCSParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_ExpCS_0=ruleExpCS();

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

                      current = this_ExpCS_0;
                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleCoIteratorVariableCS"
    // InternalQVTimperative.g:10883:1: entryRuleCoIteratorVariableCS returns [EObject current=null] : iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF ;
    public final EObject entryRuleCoIteratorVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCoIteratorVariableCS = null;


        try {
            // InternalQVTimperative.g:10884:2: (iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF )
            // InternalQVTimperative.g:10885:2: iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCoIteratorVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCoIteratorVariableCS=ruleCoIteratorVariableCS();

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

            }

        }

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


    // $ANTLR start "ruleCoIteratorVariableCS"
    // InternalQVTimperative.g:10892:1: ruleCoIteratorVariableCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) ;
    public final EObject ruleCoIteratorVariableCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10895:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) )
            // InternalQVTimperative.g:10896:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            {
            // InternalQVTimperative.g:10896:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            // InternalQVTimperative.g:10896:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            {
            // InternalQVTimperative.g:10896:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:10897:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:10897:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:10898:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_46);
            lv_name_0_0=ruleUnrestrictedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCoIteratorVariableCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:10914:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt241=2;
            int LA241_0 = input.LA(1);

            if ( (LA241_0==24) ) {
                alt241=1;
            }
            switch (alt241) {
                case 1 :
                    // InternalQVTimperative.g:10914:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTimperative.g:10918:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:10919:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:10919:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:10920:3: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedType_2_0=ruleTypeExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getCoIteratorVariableCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_2_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

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


    // $ANTLR start "entryRuleIfExpCS"
    // InternalQVTimperative.g:10944:1: entryRuleIfExpCS returns [EObject current=null] : iv_ruleIfExpCS= ruleIfExpCS EOF ;
    public final EObject entryRuleIfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIfExpCS = null;


        try {
            // InternalQVTimperative.g:10945:2: (iv_ruleIfExpCS= ruleIfExpCS EOF )
            // InternalQVTimperative.g:10946:2: iv_ruleIfExpCS= ruleIfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIfExpCS=ruleIfExpCS();

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

            }

        }

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


    // $ANTLR start "ruleIfExpCS"
    // InternalQVTimperative.g:10953:1: ruleIfExpCS returns [EObject current=null] : (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' ) ;
    public final EObject ruleIfExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedCondition_1_1 = null;

        EObject lv_ownedCondition_1_2 = null;

        EObject lv_ownedThenExpression_3_0 = null;

        EObject lv_ownedIfThenExpressions_4_0 = null;

        EObject lv_ownedElseExpression_6_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:10956:28: ( (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' ) )
            // InternalQVTimperative.g:10957:1: (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' )
            {
            // InternalQVTimperative.g:10957:1: (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' )
            // InternalQVTimperative.g:10957:3: otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif'
            {
            otherlv_0=(Token)match(input,154,FollowSets000.FOLLOW_126); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getIfExpCSAccess().getIfKeyword_0());

            }
            // InternalQVTimperative.g:10961:1: ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) )
            // InternalQVTimperative.g:10962:1: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            {
            // InternalQVTimperative.g:10962:1: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            // InternalQVTimperative.g:10963:1: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            {
            // InternalQVTimperative.g:10963:1: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            int alt242=2;
            alt242 = dfa242.predict(input);
            switch (alt242) {
                case 1 :
                    // InternalQVTimperative.g:10964:3: lv_ownedCondition_1_1= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_149);
                    lv_ownedCondition_1_1=ruleExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getIfExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedCondition",
                              		lv_ownedCondition_1_1,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:10979:8: lv_ownedCondition_1_2= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_149);
                    lv_ownedCondition_1_2=rulePatternExpCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getIfExpCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedCondition",
                              		lv_ownedCondition_1_2,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }


            }

            otherlv_2=(Token)match(input,155,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getIfExpCSAccess().getThenKeyword_2());

            }
            // InternalQVTimperative.g:11001:1: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalQVTimperative.g:11002:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11002:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalQVTimperative.g:11003:3: lv_ownedThenExpression_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_150);
            lv_ownedThenExpression_3_0=ruleExpCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getIfExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedThenExpression",
                      		lv_ownedThenExpression_3_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11019:2: ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )*
            loop243:
            do {
                int alt243=2;
                int LA243_0 = input.LA(1);

                if ( (LA243_0==158) ) {
                    alt243=1;
                }


                switch (alt243) {
            	case 1 :
            	    // InternalQVTimperative.g:11020:1: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    {
            	    // InternalQVTimperative.g:11020:1: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    // InternalQVTimperative.g:11021:3: lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_150);
            	    lv_ownedIfThenExpressions_4_0=ruleElseIfThenExpCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getIfExpCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedIfThenExpressions",
            	              		lv_ownedIfThenExpressions_4_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ElseIfThenExpCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop243;
                }
            } while (true);

            otherlv_5=(Token)match(input,156,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getIfExpCSAccess().getElseKeyword_5());

            }
            // InternalQVTimperative.g:11041:1: ( (lv_ownedElseExpression_6_0= ruleExpCS ) )
            // InternalQVTimperative.g:11042:1: (lv_ownedElseExpression_6_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11042:1: (lv_ownedElseExpression_6_0= ruleExpCS )
            // InternalQVTimperative.g:11043:3: lv_ownedElseExpression_6_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());

            }
            pushFollow(FollowSets000.FOLLOW_151);
            lv_ownedElseExpression_6_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getIfExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedElseExpression",
                      		lv_ownedElseExpression_6_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_7=(Token)match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_7, grammarAccess.getIfExpCSAccess().getEndifKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIfExpCS"


    // $ANTLR start "entryRuleElseIfThenExpCS"
    // InternalQVTimperative.g:11071:1: entryRuleElseIfThenExpCS returns [EObject current=null] : iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF ;
    public final EObject entryRuleElseIfThenExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleElseIfThenExpCS = null;


        try {
            // InternalQVTimperative.g:11072:2: (iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF )
            // InternalQVTimperative.g:11073:2: iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getElseIfThenExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleElseIfThenExpCS=ruleElseIfThenExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleElseIfThenExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleElseIfThenExpCS"


    // $ANTLR start "ruleElseIfThenExpCS"
    // InternalQVTimperative.g:11080:1: ruleElseIfThenExpCS returns [EObject current=null] : (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ) ;
    public final EObject ruleElseIfThenExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_ownedCondition_1_0 = null;

        EObject lv_ownedThenExpression_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11083:28: ( (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ) )
            // InternalQVTimperative.g:11084:1: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            {
            // InternalQVTimperative.g:11084:1: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            // InternalQVTimperative.g:11084:3: otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            {
            otherlv_0=(Token)match(input,158,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());

            }
            // InternalQVTimperative.g:11088:1: ( (lv_ownedCondition_1_0= ruleExpCS ) )
            // InternalQVTimperative.g:11089:1: (lv_ownedCondition_1_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11089:1: (lv_ownedCondition_1_0= ruleExpCS )
            // InternalQVTimperative.g:11090:3: lv_ownedCondition_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_149);
            lv_ownedCondition_1_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getElseIfThenExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedCondition",
                      		lv_ownedCondition_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,155,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());

            }
            // InternalQVTimperative.g:11110:1: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalQVTimperative.g:11111:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11111:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalQVTimperative.g:11112:3: lv_ownedThenExpression_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedThenExpression_3_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getElseIfThenExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedThenExpression",
                      		lv_ownedThenExpression_3_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleElseIfThenExpCS"


    // $ANTLR start "entryRuleLetExpCS"
    // InternalQVTimperative.g:11136:1: entryRuleLetExpCS returns [EObject current=null] : iv_ruleLetExpCS= ruleLetExpCS EOF ;
    public final EObject entryRuleLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetExpCS = null;


        try {
            // InternalQVTimperative.g:11137:2: (iv_ruleLetExpCS= ruleLetExpCS EOF )
            // InternalQVTimperative.g:11138:2: iv_ruleLetExpCS= ruleLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLetExpCS=ruleLetExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLetExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLetExpCS"


    // $ANTLR start "ruleLetExpCS"
    // InternalQVTimperative.g:11145:1: ruleLetExpCS returns [EObject current=null] : (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) ) ;
    public final EObject ruleLetExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedVariables_1_0 = null;

        EObject lv_ownedVariables_3_0 = null;

        EObject lv_ownedInExpression_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11148:28: ( (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) ) )
            // InternalQVTimperative.g:11149:1: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            {
            // InternalQVTimperative.g:11149:1: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            // InternalQVTimperative.g:11149:3: otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) )
            {
            otherlv_0=(Token)match(input,159,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getLetExpCSAccess().getLetKeyword_0());

            }
            // InternalQVTimperative.g:11153:1: ( (lv_ownedVariables_1_0= ruleLetVariableCS ) )
            // InternalQVTimperative.g:11154:1: (lv_ownedVariables_1_0= ruleLetVariableCS )
            {
            // InternalQVTimperative.g:11154:1: (lv_ownedVariables_1_0= ruleLetVariableCS )
            // InternalQVTimperative.g:11155:3: lv_ownedVariables_1_0= ruleLetVariableCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_152);
            lv_ownedVariables_1_0=ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getLetExpCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedVariables",
                      		lv_ownedVariables_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.LetVariableCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11171:2: (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )*
            loop244:
            do {
                int alt244=2;
                int LA244_0 = input.LA(1);

                if ( (LA244_0==18) ) {
                    alt244=1;
                }


                switch (alt244) {
            	case 1 :
            	    // InternalQVTimperative.g:11171:4: otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    {
            	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTimperative.g:11175:1: ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    // InternalQVTimperative.g:11176:1: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    {
            	    // InternalQVTimperative.g:11176:1: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    // InternalQVTimperative.g:11177:3: lv_ownedVariables_3_0= ruleLetVariableCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_152);
            	    lv_ownedVariables_3_0=ruleLetVariableCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getLetExpCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedVariables",
            	              		lv_ownedVariables_3_0,
            	              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.LetVariableCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop244;
                }
            } while (true);

            otherlv_4=(Token)match(input,49,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getLetExpCSAccess().getInKeyword_3());

            }
            // InternalQVTimperative.g:11197:1: ( (lv_ownedInExpression_5_0= ruleExpCS ) )
            // InternalQVTimperative.g:11198:1: (lv_ownedInExpression_5_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11198:1: (lv_ownedInExpression_5_0= ruleExpCS )
            // InternalQVTimperative.g:11199:3: lv_ownedInExpression_5_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInExpression_5_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getLetExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedInExpression",
                      		lv_ownedInExpression_5_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLetExpCS"


    // $ANTLR start "entryRuleLetVariableCS"
    // InternalQVTimperative.g:11223:1: entryRuleLetVariableCS returns [EObject current=null] : iv_ruleLetVariableCS= ruleLetVariableCS EOF ;
    public final EObject entryRuleLetVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetVariableCS = null;


        try {
            // InternalQVTimperative.g:11224:2: (iv_ruleLetVariableCS= ruleLetVariableCS EOF )
            // InternalQVTimperative.g:11225:2: iv_ruleLetVariableCS= ruleLetVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLetVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLetVariableCS=ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLetVariableCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLetVariableCS"


    // $ANTLR start "ruleLetVariableCS"
    // InternalQVTimperative.g:11232:1: ruleLetVariableCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) ) ;
    public final EObject ruleLetVariableCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedRoundBracketedClause_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11235:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) ) )
            // InternalQVTimperative.g:11236:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )
            {
            // InternalQVTimperative.g:11236:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )
            // InternalQVTimperative.g:11236:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
            {
            // InternalQVTimperative.g:11236:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:11237:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:11237:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:11238:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_153);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11254:2: ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )?
            int alt245=2;
            int LA245_0 = input.LA(1);

            if ( (LA245_0==56) ) {
                alt245=1;
            }
            switch (alt245) {
                case 1 :
                    // InternalQVTimperative.g:11255:1: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalQVTimperative.g:11255:1: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    // InternalQVTimperative.g:11256:3: lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_133);
                    lv_ownedRoundBracketedClause_1_0=ruleRoundBracketedClauseCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedRoundBracketedClause",
                              		lv_ownedRoundBracketedClause_1_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.RoundBracketedClauseCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTimperative.g:11272:3: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )?
            int alt246=2;
            int LA246_0 = input.LA(1);

            if ( (LA246_0==24) ) {
                alt246=1;
            }
            switch (alt246) {
                case 1 :
                    // InternalQVTimperative.g:11272:5: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    {
                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTimperative.g:11276:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTimperative.g:11277:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTimperative.g:11277:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTimperative.g:11278:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_130);
                    lv_ownedType_3_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedType",
                              		lv_ownedType_3_0,
                              		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());

            }
            // InternalQVTimperative.g:11298:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
            // InternalQVTimperative.g:11299:1: (lv_ownedInitExpression_5_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11299:1: (lv_ownedInitExpression_5_0= ruleExpCS )
            // InternalQVTimperative.g:11300:3: lv_ownedInitExpression_5_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInitExpression_5_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedInitExpression",
                      		lv_ownedInitExpression_5_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLetVariableCS"


    // $ANTLR start "entryRuleNestedExpCS"
    // InternalQVTimperative.g:11324:1: entryRuleNestedExpCS returns [EObject current=null] : iv_ruleNestedExpCS= ruleNestedExpCS EOF ;
    public final EObject entryRuleNestedExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNestedExpCS = null;


        try {
            // InternalQVTimperative.g:11325:2: (iv_ruleNestedExpCS= ruleNestedExpCS EOF )
            // InternalQVTimperative.g:11326:2: iv_ruleNestedExpCS= ruleNestedExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNestedExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNestedExpCS=ruleNestedExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNestedExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNestedExpCS"


    // $ANTLR start "ruleNestedExpCS"
    // InternalQVTimperative.g:11333:1: ruleNestedExpCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' ) ;
    public final EObject ruleNestedExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_ownedExpression_1_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11336:28: ( (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' ) )
            // InternalQVTimperative.g:11337:1: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            {
            // InternalQVTimperative.g:11337:1: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            // InternalQVTimperative.g:11337:3: otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,56,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());

            }
            // InternalQVTimperative.g:11341:1: ( (lv_ownedExpression_1_0= ruleExpCS ) )
            // InternalQVTimperative.g:11342:1: (lv_ownedExpression_1_0= ruleExpCS )
            {
            // InternalQVTimperative.g:11342:1: (lv_ownedExpression_1_0= ruleExpCS )
            // InternalQVTimperative.g:11343:3: lv_ownedExpression_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_123);
            lv_ownedExpression_1_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNestedExpCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedExpression",
                      		lv_ownedExpression_1_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNestedExpCS"


    // $ANTLR start "entryRuleSelfExpCS"
    // InternalQVTimperative.g:11371:1: entryRuleSelfExpCS returns [EObject current=null] : iv_ruleSelfExpCS= ruleSelfExpCS EOF ;
    public final EObject entryRuleSelfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSelfExpCS = null;


        try {
            // InternalQVTimperative.g:11372:2: (iv_ruleSelfExpCS= ruleSelfExpCS EOF )
            // InternalQVTimperative.g:11373:2: iv_ruleSelfExpCS= ruleSelfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSelfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSelfExpCS=ruleSelfExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSelfExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSelfExpCS"


    // $ANTLR start "ruleSelfExpCS"
    // InternalQVTimperative.g:11380:1: ruleSelfExpCS returns [EObject current=null] : ( () otherlv_1= 'self' ) ;
    public final EObject ruleSelfExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:11383:28: ( ( () otherlv_1= 'self' ) )
            // InternalQVTimperative.g:11384:1: ( () otherlv_1= 'self' )
            {
            // InternalQVTimperative.g:11384:1: ( () otherlv_1= 'self' )
            // InternalQVTimperative.g:11384:2: () otherlv_1= 'self'
            {
            // InternalQVTimperative.g:11384:2: ()
            // InternalQVTimperative.g:11385:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,160,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSelfExpCS"


    // $ANTLR start "entryRuleMultiplicityBoundsCS"
    // InternalQVTimperative.g:11405:1: entryRuleMultiplicityBoundsCS returns [EObject current=null] : iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF ;
    public final EObject entryRuleMultiplicityBoundsCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityBoundsCS = null;


        try {
            // InternalQVTimperative.g:11406:2: (iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF )
            // InternalQVTimperative.g:11407:2: iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityBoundsCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityBoundsCS=ruleMultiplicityBoundsCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityBoundsCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityBoundsCS"


    // $ANTLR start "ruleMultiplicityBoundsCS"
    // InternalQVTimperative.g:11414:1: ruleMultiplicityBoundsCS returns [EObject current=null] : ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? ) ;
    public final EObject ruleMultiplicityBoundsCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_lowerBound_0_0 = null;

        AntlrDatatypeRuleToken lv_upperBound_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11417:28: ( ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? ) )
            // InternalQVTimperative.g:11418:1: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            {
            // InternalQVTimperative.g:11418:1: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            // InternalQVTimperative.g:11418:2: ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            {
            // InternalQVTimperative.g:11418:2: ( (lv_lowerBound_0_0= ruleLOWER ) )
            // InternalQVTimperative.g:11419:1: (lv_lowerBound_0_0= ruleLOWER )
            {
            // InternalQVTimperative.g:11419:1: (lv_lowerBound_0_0= ruleLOWER )
            // InternalQVTimperative.g:11420:3: lv_lowerBound_0_0= ruleLOWER
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_127);
            lv_lowerBound_0_0=ruleLOWER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getMultiplicityBoundsCSRule());
              	        }
                     		set(
                     			current,
                     			"lowerBound",
                      		lv_lowerBound_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.LOWER");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11436:2: (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            int alt247=2;
            int LA247_0 = input.LA(1);

            if ( (LA247_0==27) ) {
                alt247=1;
            }
            switch (alt247) {
                case 1 :
                    // InternalQVTimperative.g:11436:4: otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) )
                    {
                    otherlv_1=(Token)match(input,27,FollowSets000.FOLLOW_154); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());

                    }
                    // InternalQVTimperative.g:11440:1: ( (lv_upperBound_2_0= ruleUPPER ) )
                    // InternalQVTimperative.g:11441:1: (lv_upperBound_2_0= ruleUPPER )
                    {
                    // InternalQVTimperative.g:11441:1: (lv_upperBound_2_0= ruleUPPER )
                    // InternalQVTimperative.g:11442:3: lv_upperBound_2_0= ruleUPPER
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_upperBound_2_0=ruleUPPER();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getMultiplicityBoundsCSRule());
                      	        }
                             		set(
                             			current,
                             			"upperBound",
                              		lv_upperBound_2_0,
                              		"org.eclipse.ocl.xtext.base.Base.UPPER");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityBoundsCS"


    // $ANTLR start "entryRuleMultiplicityCS"
    // InternalQVTimperative.g:11466:1: entryRuleMultiplicityCS returns [EObject current=null] : iv_ruleMultiplicityCS= ruleMultiplicityCS EOF ;
    public final EObject entryRuleMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityCS = null;


        try {
            // InternalQVTimperative.g:11467:2: (iv_ruleMultiplicityCS= ruleMultiplicityCS EOF )
            // InternalQVTimperative.g:11468:2: iv_ruleMultiplicityCS= ruleMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityCS=ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityCS"


    // $ANTLR start "ruleMultiplicityCS"
    // InternalQVTimperative.g:11475:1: ruleMultiplicityCS returns [EObject current=null] : (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' ) ;
    public final EObject ruleMultiplicityCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token lv_isNullFree_4_0=null;
        Token otherlv_5=null;
        EObject this_MultiplicityBoundsCS_1 = null;

        EObject this_MultiplicityStringCS_2 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11478:28: ( (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' ) )
            // InternalQVTimperative.g:11479:1: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            {
            // InternalQVTimperative.g:11479:1: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            // InternalQVTimperative.g:11479:3: otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']'
            {
            otherlv_0=(Token)match(input,151,FollowSets000.FOLLOW_155); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalQVTimperative.g:11483:1: (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS )
            int alt248=2;
            int LA248_0 = input.LA(1);

            if ( (LA248_0==RULE_INT) ) {
                alt248=1;
            }
            else if ( (LA248_0==42||LA248_0==110||LA248_0==163) ) {
                alt248=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 248, 0, input);

                throw nvae;
            }
            switch (alt248) {
                case 1 :
                    // InternalQVTimperative.g:11484:2: this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_156);
                    this_MultiplicityBoundsCS_1=ruleMultiplicityBoundsCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current = this_MultiplicityBoundsCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:11497:2: this_MultiplicityStringCS_2= ruleMultiplicityStringCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_156);
                    this_MultiplicityStringCS_2=ruleMultiplicityStringCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current = this_MultiplicityStringCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }

            // InternalQVTimperative.g:11508:2: (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )?
            int alt249=3;
            int LA249_0 = input.LA(1);

            if ( (LA249_0==161) ) {
                alt249=1;
            }
            else if ( (LA249_0==162) ) {
                alt249=2;
            }
            switch (alt249) {
                case 1 :
                    // InternalQVTimperative.g:11508:4: otherlv_3= '|?'
                    {
                    otherlv_3=(Token)match(input,161,FollowSets000.FOLLOW_157); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:11513:6: ( (lv_isNullFree_4_0= '|1' ) )
                    {
                    // InternalQVTimperative.g:11513:6: ( (lv_isNullFree_4_0= '|1' ) )
                    // InternalQVTimperative.g:11514:1: (lv_isNullFree_4_0= '|1' )
                    {
                    // InternalQVTimperative.g:11514:1: (lv_isNullFree_4_0= '|1' )
                    // InternalQVTimperative.g:11515:3: lv_isNullFree_4_0= '|1'
                    {
                    lv_isNullFree_4_0=(Token)match(input,162,FollowSets000.FOLLOW_157); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isNullFree_4_0, grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMultiplicityCSRule());
                      	        }
                             		setWithLastConsumed(current, "isNullFree", true, "|1");

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_5=(Token)match(input,152,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityCS"


    // $ANTLR start "entryRuleMultiplicityStringCS"
    // InternalQVTimperative.g:11540:1: entryRuleMultiplicityStringCS returns [EObject current=null] : iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF ;
    public final EObject entryRuleMultiplicityStringCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityStringCS = null;


        try {
            // InternalQVTimperative.g:11541:2: (iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF )
            // InternalQVTimperative.g:11542:2: iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityStringCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityStringCS=ruleMultiplicityStringCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityStringCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityStringCS"


    // $ANTLR start "ruleMultiplicityStringCS"
    // InternalQVTimperative.g:11549:1: ruleMultiplicityStringCS returns [EObject current=null] : ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) ) ;
    public final EObject ruleMultiplicityStringCS() throws RecognitionException {
        EObject current = null;

        Token lv_stringBounds_0_1=null;
        Token lv_stringBounds_0_2=null;
        Token lv_stringBounds_0_3=null;

         enterRule();

        try {
            // InternalQVTimperative.g:11552:28: ( ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) ) )
            // InternalQVTimperative.g:11553:1: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            {
            // InternalQVTimperative.g:11553:1: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            // InternalQVTimperative.g:11554:1: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            {
            // InternalQVTimperative.g:11554:1: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            // InternalQVTimperative.g:11555:1: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            {
            // InternalQVTimperative.g:11555:1: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            int alt250=3;
            switch ( input.LA(1) ) {
            case 42:
                {
                alt250=1;
                }
                break;
            case 110:
                {
                alt250=2;
                }
                break;
            case 163:
                {
                alt250=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 250, 0, input);

                throw nvae;
            }

            switch (alt250) {
                case 1 :
                    // InternalQVTimperative.g:11556:3: lv_stringBounds_0_1= '*'
                    {
                    lv_stringBounds_0_1=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_stringBounds_0_1, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      	        }
                             		setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_1, null);

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:11568:8: lv_stringBounds_0_2= '+'
                    {
                    lv_stringBounds_0_2=(Token)match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_stringBounds_0_2, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      	        }
                             		setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_2, null);

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTimperative.g:11580:8: lv_stringBounds_0_3= '?'
                    {
                    lv_stringBounds_0_3=(Token)match(input,163,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_stringBounds_0_3, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      	        }
                             		setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_3, null);

                    }

                    }
                    break;

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityStringCS"


    // $ANTLR start "entryRulePathNameCS"
    // InternalQVTimperative.g:11603:1: entryRulePathNameCS returns [EObject current=null] : iv_rulePathNameCS= rulePathNameCS EOF ;
    public final EObject entryRulePathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePathNameCS = null;


        try {
            // InternalQVTimperative.g:11604:2: (iv_rulePathNameCS= rulePathNameCS EOF )
            // InternalQVTimperative.g:11605:2: iv_rulePathNameCS= rulePathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePathNameCS=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePathNameCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePathNameCS"


    // $ANTLR start "rulePathNameCS"
    // InternalQVTimperative.g:11612:1: rulePathNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) ;
    public final EObject rulePathNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11615:28: ( ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalQVTimperative.g:11616:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalQVTimperative.g:11616:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalQVTimperative.g:11616:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalQVTimperative.g:11616:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) )
            // InternalQVTimperative.g:11617:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            {
            // InternalQVTimperative.g:11617:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            // InternalQVTimperative.g:11618:3: lv_ownedPathElements_0_0= ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_120);
            lv_ownedPathElements_0_0=ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPathNameCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedPathElements",
                      		lv_ownedPathElements_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.FirstPathElementCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11634:2: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop251:
            do {
                int alt251=2;
                int LA251_0 = input.LA(1);

                if ( (LA251_0==41) ) {
                    alt251=1;
                }


                switch (alt251) {
            	case 1 :
            	    // InternalQVTimperative.g:11634:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_12); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalQVTimperative.g:11638:1: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTimperative.g:11639:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTimperative.g:11639:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTimperative.g:11640:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_120);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getPathNameCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedPathElements",
            	              		lv_ownedPathElements_2_0,
            	              		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop251;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePathNameCS"


    // $ANTLR start "entryRuleFirstPathElementCS"
    // InternalQVTimperative.g:11666:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
    public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFirstPathElementCS = null;


        try {
            // InternalQVTimperative.g:11667:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
            // InternalQVTimperative.g:11668:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleFirstPathElementCS=ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFirstPathElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFirstPathElementCS"


    // $ANTLR start "ruleFirstPathElementCS"
    // InternalQVTimperative.g:11675:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
    public final EObject ruleFirstPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalQVTimperative.g:11678:28: ( ( ( ruleUnrestrictedName ) ) )
            // InternalQVTimperative.g:11679:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalQVTimperative.g:11679:1: ( ( ruleUnrestrictedName ) )
            // InternalQVTimperative.g:11680:1: ( ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:11680:1: ( ruleUnrestrictedName )
            // InternalQVTimperative.g:11681:3: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getFirstPathElementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFirstPathElementCS"


    // $ANTLR start "entryRuleNextPathElementCS"
    // InternalQVTimperative.g:11705:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
    public final EObject entryRuleNextPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNextPathElementCS = null;


        try {
            // InternalQVTimperative.g:11706:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
            // InternalQVTimperative.g:11707:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNextPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNextPathElementCS=ruleNextPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNextPathElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNextPathElementCS"


    // $ANTLR start "ruleNextPathElementCS"
    // InternalQVTimperative.g:11714:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
    public final EObject ruleNextPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalQVTimperative.g:11717:28: ( ( ( ruleUnreservedName ) ) )
            // InternalQVTimperative.g:11718:1: ( ( ruleUnreservedName ) )
            {
            // InternalQVTimperative.g:11718:1: ( ( ruleUnreservedName ) )
            // InternalQVTimperative.g:11719:1: ( ruleUnreservedName )
            {
            // InternalQVTimperative.g:11719:1: ( ruleUnreservedName )
            // InternalQVTimperative.g:11720:3: ruleUnreservedName
            {
            if ( state.backtracking==0 ) {

              		  /* */

            }
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getNextPathElementCSRule());
              	        }

            }
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnreservedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNextPathElementCS"


    // $ANTLR start "entryRuleTemplateBindingCS"
    // InternalQVTimperative.g:11744:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
    public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateBindingCS = null;


        try {
            // InternalQVTimperative.g:11745:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
            // InternalQVTimperative.g:11746:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateBindingCS=ruleTemplateBindingCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateBindingCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateBindingCS"


    // $ANTLR start "ruleTemplateBindingCS"
    // InternalQVTimperative.g:11753:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTemplateBindingCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedSubstitutions_0_0 = null;

        EObject lv_ownedSubstitutions_2_0 = null;

        EObject lv_ownedMultiplicity_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11756:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTimperative.g:11757:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTimperative.g:11757:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
            // InternalQVTimperative.g:11757:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
            {
            // InternalQVTimperative.g:11757:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
            // InternalQVTimperative.g:11758:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
            {
            // InternalQVTimperative.g:11758:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
            // InternalQVTimperative.g:11759:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_158);
            lv_ownedSubstitutions_0_0=ruleTemplateParameterSubstitutionCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTemplateBindingCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedSubstitutions",
                      		lv_ownedSubstitutions_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.TemplateParameterSubstitutionCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11775:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
            loop252:
            do {
                int alt252=2;
                int LA252_0 = input.LA(1);

                if ( (LA252_0==18) ) {
                    alt252=1;
                }


                switch (alt252) {
            	case 1 :
            	    // InternalQVTimperative.g:11775:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
            	    {
            	    otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_159); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());

            	    }
            	    // InternalQVTimperative.g:11779:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
            	    // InternalQVTimperative.g:11780:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
            	    {
            	    // InternalQVTimperative.g:11780:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
            	    // InternalQVTimperative.g:11781:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_158);
            	    lv_ownedSubstitutions_2_0=ruleTemplateParameterSubstitutionCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTemplateBindingCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedSubstitutions",
            	              		lv_ownedSubstitutions_2_0,
            	              		"org.eclipse.ocl.xtext.base.Base.TemplateParameterSubstitutionCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop252;
                }
            } while (true);

            // InternalQVTimperative.g:11797:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
            int alt253=2;
            int LA253_0 = input.LA(1);

            if ( (LA253_0==151) ) {
                alt253=1;
            }
            switch (alt253) {
                case 1 :
                    // InternalQVTimperative.g:11798:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                    {
                    // InternalQVTimperative.g:11798:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                    // InternalQVTimperative.g:11799:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_3_0=ruleMultiplicityCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTemplateBindingCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedMultiplicity",
                              		lv_ownedMultiplicity_3_0,
                              		"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateBindingCS"


    // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
    // InternalQVTimperative.g:11823:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
    public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateParameterSubstitutionCS = null;


        try {
            // InternalQVTimperative.g:11824:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
            // InternalQVTimperative.g:11825:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateParameterSubstitutionCS=ruleTemplateParameterSubstitutionCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateParameterSubstitutionCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateParameterSubstitutionCS"


    // $ANTLR start "ruleTemplateParameterSubstitutionCS"
    // InternalQVTimperative.g:11832:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
    public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedActualParameter_0_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11835:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
            // InternalQVTimperative.g:11836:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            {
            // InternalQVTimperative.g:11836:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            // InternalQVTimperative.g:11837:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            {
            // InternalQVTimperative.g:11837:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            // InternalQVTimperative.g:11838:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedActualParameter_0_0=ruleTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTemplateParameterSubstitutionCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedActualParameter",
                      		lv_ownedActualParameter_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.TypeRefCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateParameterSubstitutionCS"


    // $ANTLR start "entryRuleTemplateSignatureCS"
    // InternalQVTimperative.g:11862:1: entryRuleTemplateSignatureCS returns [EObject current=null] : iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF ;
    public final EObject entryRuleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateSignatureCS = null;


        try {
            // InternalQVTimperative.g:11863:2: (iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF )
            // InternalQVTimperative.g:11864:2: iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateSignatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateSignatureCS=ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateSignatureCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateSignatureCS"


    // $ANTLR start "ruleTemplateSignatureCS"
    // InternalQVTimperative.g:11871:1: ruleTemplateSignatureCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) ;
    public final EObject ruleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedParameters_1_0 = null;

        EObject lv_ownedParameters_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11874:28: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) )
            // InternalQVTimperative.g:11875:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
            {
            // InternalQVTimperative.g:11875:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
            // InternalQVTimperative.g:11875:3: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
            {
            otherlv_0=(Token)match(input,56,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0());

            }
            // InternalQVTimperative.g:11879:1: ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) )
            // InternalQVTimperative.g:11880:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
            {
            // InternalQVTimperative.g:11880:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
            // InternalQVTimperative.g:11881:3: lv_ownedParameters_1_0= ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_56);
            lv_ownedParameters_1_0=ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTemplateSignatureCSRule());
              	        }
                     		add(
                     			current,
                     			"ownedParameters",
                      		lv_ownedParameters_1_0,
                      		"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11897:2: (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )*
            loop254:
            do {
                int alt254=2;
                int LA254_0 = input.LA(1);

                if ( (LA254_0==18) ) {
                    alt254=1;
                }


                switch (alt254) {
            	case 1 :
            	    // InternalQVTimperative.g:11897:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
            	    {
            	    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTimperative.g:11901:1: ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
            	    // InternalQVTimperative.g:11902:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
            	    {
            	    // InternalQVTimperative.g:11902:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
            	    // InternalQVTimperative.g:11903:3: lv_ownedParameters_3_0= ruleTypeParameterCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_56);
            	    lv_ownedParameters_3_0=ruleTypeParameterCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTemplateSignatureCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedParameters",
            	              		lv_ownedParameters_3_0,
            	              		"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop254;
                }
            } while (true);

            otherlv_4=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateSignatureCS"


    // $ANTLR start "entryRuleTypeParameterCS"
    // InternalQVTimperative.g:11931:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
    public final EObject entryRuleTypeParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeParameterCS = null;


        try {
            // InternalQVTimperative.g:11932:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
            // InternalQVTimperative.g:11933:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeParameterCS=ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeParameterCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeParameterCS"


    // $ANTLR start "ruleTypeParameterCS"
    // InternalQVTimperative.g:11940:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
    public final EObject ruleTypeParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedExtends_2_0 = null;

        EObject lv_ownedExtends_4_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:11943:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
            // InternalQVTimperative.g:11944:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            {
            // InternalQVTimperative.g:11944:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            // InternalQVTimperative.g:11944:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            {
            // InternalQVTimperative.g:11944:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTimperative.g:11945:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTimperative.g:11945:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTimperative.g:11946:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_160);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_0_0,
                      		"org.eclipse.qvtd.xtext.qvtimperative.QVTimperative.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:11962:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            int alt256=2;
            int LA256_0 = input.LA(1);

            if ( (LA256_0==104) ) {
                alt256=1;
            }
            switch (alt256) {
                case 1 :
                    // InternalQVTimperative.g:11962:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_1=(Token)match(input,104,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());

                    }
                    // InternalQVTimperative.g:11966:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
                    // InternalQVTimperative.g:11967:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    {
                    // InternalQVTimperative.g:11967:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    // InternalQVTimperative.g:11968:3: lv_ownedExtends_2_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_161);
                    lv_ownedExtends_2_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedExtends",
                              		lv_ownedExtends_2_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTimperative.g:11984:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    loop255:
                    do {
                        int alt255=2;
                        int LA255_0 = input.LA(1);

                        if ( (LA255_0==164) ) {
                            alt255=1;
                        }


                        switch (alt255) {
                    	case 1 :
                    	    // InternalQVTimperative.g:11984:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,164,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());

                    	    }
                    	    // InternalQVTimperative.g:11988:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    // InternalQVTimperative.g:11989:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTimperative.g:11989:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    // InternalQVTimperative.g:11990:3: lv_ownedExtends_4_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_161);
                    	    lv_ownedExtends_4_0=ruleTypedRefCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedExtends",
                    	              		lv_ownedExtends_4_0,
                    	              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop255;
                        }
                    } while (true);


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeParameterCS"


    // $ANTLR start "entryRuleTypeRefCS"
    // InternalQVTimperative.g:12014:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
    public final EObject entryRuleTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeRefCS = null;


        try {
            // InternalQVTimperative.g:12015:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
            // InternalQVTimperative.g:12016:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeRefCS=ruleTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeRefCS"


    // $ANTLR start "ruleTypeRefCS"
    // InternalQVTimperative.g:12023:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
    public final EObject ruleTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypedRefCS_0 = null;

        EObject this_WildcardTypeRefCS_1 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:12026:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
            // InternalQVTimperative.g:12027:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            {
            // InternalQVTimperative.g:12027:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            int alt257=2;
            int LA257_0 = input.LA(1);

            if ( ((LA257_0>=RULE_SIMPLE_ID && LA257_0<=RULE_ESCAPED_ID)||LA257_0==17||LA257_0==19||(LA257_0>=22 && LA257_0<=23)||(LA257_0>=25 && LA257_0<=26)||(LA257_0>=29 && LA257_0<=34)||LA257_0==39||(LA257_0>=43 && LA257_0<=48)||(LA257_0>=50 && LA257_0<=52)||(LA257_0>=54 && LA257_0<=55)||(LA257_0>=58 && LA257_0<=60)||(LA257_0>=62 && LA257_0<=70)||LA257_0==72||LA257_0==74||LA257_0==76||LA257_0==79||LA257_0==81||LA257_0==83||(LA257_0>=85 && LA257_0<=89)||(LA257_0>=91 && LA257_0<=96)||LA257_0==98||LA257_0==100||(LA257_0>=102 && LA257_0<=105)||(LA257_0>=127 && LA257_0<=141)) ) {
                alt257=1;
            }
            else if ( (LA257_0==163) ) {
                alt257=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 257, 0, input);

                throw nvae;
            }
            switch (alt257) {
                case 1 :
                    // InternalQVTimperative.g:12028:2: this_TypedRefCS_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypedRefCS_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current = this_TypedRefCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:12041:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_WildcardTypeRefCS_1=ruleWildcardTypeRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current = this_WildcardTypeRefCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeRefCS"


    // $ANTLR start "entryRuleTypedTypeRefCS"
    // InternalQVTimperative.g:12060:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
    public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedTypeRefCS = null;


        try {
            // InternalQVTimperative.g:12061:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
            // InternalQVTimperative.g:12062:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedTypeRefCS=ruleTypedTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypedTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypedTypeRefCS"


    // $ANTLR start "ruleTypedTypeRefCS"
    // InternalQVTimperative.g:12069:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
    public final EObject ruleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedBinding_2_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:12072:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
            // InternalQVTimperative.g:12073:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
            {
            // InternalQVTimperative.g:12073:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
            // InternalQVTimperative.g:12073:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
            {
            // InternalQVTimperative.g:12073:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTimperative.g:12074:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTimperative.g:12074:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTimperative.g:12075:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_121);
            lv_ownedPathName_0_0=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getTypedTypeRefCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedPathName",
                      		lv_ownedPathName_0_0,
                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTimperative.g:12091:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
            int alt258=2;
            int LA258_0 = input.LA(1);

            if ( (LA258_0==56) ) {
                alt258=1;
            }
            switch (alt258) {
                case 1 :
                    // InternalQVTimperative.g:12091:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_159); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTimperative.g:12095:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
                    // InternalQVTimperative.g:12096:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                    {
                    // InternalQVTimperative.g:12096:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                    // InternalQVTimperative.g:12097:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_123);
                    lv_ownedBinding_2_0=ruleTemplateBindingCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getTypedTypeRefCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedBinding",
                              		lv_ownedBinding_2_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateBindingCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_3=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedTypeRefCS"


    // $ANTLR start "entryRuleWildcardTypeRefCS"
    // InternalQVTimperative.g:12125:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
    public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWildcardTypeRefCS = null;


        try {
            // InternalQVTimperative.g:12126:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
            // InternalQVTimperative.g:12127:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWildcardTypeRefCS=ruleWildcardTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleWildcardTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleWildcardTypeRefCS"


    // $ANTLR start "ruleWildcardTypeRefCS"
    // InternalQVTimperative.g:12134:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
    public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_ownedExtends_3_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:12137:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
            // InternalQVTimperative.g:12138:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            {
            // InternalQVTimperative.g:12138:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            // InternalQVTimperative.g:12138:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            {
            // InternalQVTimperative.g:12138:2: ()
            // InternalQVTimperative.g:12139:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,163,FollowSets000.FOLLOW_160); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());

            }
            // InternalQVTimperative.g:12151:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            int alt259=2;
            int LA259_0 = input.LA(1);

            if ( (LA259_0==104) ) {
                alt259=1;
            }
            switch (alt259) {
                case 1 :
                    // InternalQVTimperative.g:12151:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    {
                    otherlv_2=(Token)match(input,104,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());

                    }
                    // InternalQVTimperative.g:12155:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    // InternalQVTimperative.g:12156:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    {
                    // InternalQVTimperative.g:12156:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    // InternalQVTimperative.g:12157:3: lv_ownedExtends_3_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExtends_3_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getWildcardTypeRefCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedExtends",
                              		lv_ownedExtends_3_0,
                              		"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleWildcardTypeRefCS"


    // $ANTLR start "entryRuleID"
    // InternalQVTimperative.g:12181:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
    public final String entryRuleID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleID = null;


        try {
            // InternalQVTimperative.g:12182:2: (iv_ruleID= ruleID EOF )
            // InternalQVTimperative.g:12183:2: iv_ruleID= ruleID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleID=ruleID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleID.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleID"


    // $ANTLR start "ruleID"
    // InternalQVTimperative.g:12190:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
    public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SIMPLE_ID_0=null;
        Token this_ESCAPED_ID_1=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12193:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
            // InternalQVTimperative.g:12194:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            {
            // InternalQVTimperative.g:12194:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            int alt260=2;
            int LA260_0 = input.LA(1);

            if ( (LA260_0==RULE_SIMPLE_ID) ) {
                alt260=1;
            }
            else if ( (LA260_0==RULE_ESCAPED_ID) ) {
                alt260=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 260, 0, input);

                throw nvae;
            }
            switch (alt260) {
                case 1 :
                    // InternalQVTimperative.g:12194:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                    {
                    this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		current.merge(this_SIMPLE_ID_0);

                    }
                    if ( state.backtracking==0 ) {

                          newLeafNode(this_SIMPLE_ID_0, grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:12202:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                    {
                    this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		current.merge(this_ESCAPED_ID_1);

                    }
                    if ( state.backtracking==0 ) {

                          newLeafNode(this_ESCAPED_ID_1, grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleID"


    // $ANTLR start "entryRuleIdentifier"
    // InternalQVTimperative.g:12217:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
    public final String entryRuleIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdentifier = null;


        try {
            // InternalQVTimperative.g:12218:2: (iv_ruleIdentifier= ruleIdentifier EOF )
            // InternalQVTimperative.g:12219:2: iv_ruleIdentifier= ruleIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIdentifier=ruleIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIdentifier.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleIdentifier"


    // $ANTLR start "ruleIdentifier"
    // InternalQVTimperative.g:12226:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
    public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_ID_0 = null;


         enterRule();

        try {
            // InternalQVTimperative.g:12229:28: (this_ID_0= ruleID )
            // InternalQVTimperative.g:12231:5: this_ID_0= ruleID
            {
            if ( state.backtracking==0 ) {

                      newCompositeNode(grammarAccess.getIdentifierAccess().getIDParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_ID_0=ruleID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);

            }
            if ( state.backtracking==0 ) {

                      afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIdentifier"


    // $ANTLR start "entryRuleLOWER"
    // InternalQVTimperative.g:12249:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
    public final String entryRuleLOWER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLOWER = null;


        try {
            // InternalQVTimperative.g:12250:2: (iv_ruleLOWER= ruleLOWER EOF )
            // InternalQVTimperative.g:12251:2: iv_ruleLOWER= ruleLOWER EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLOWERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLOWER=ruleLOWER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLOWER.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLOWER"


    // $ANTLR start "ruleLOWER"
    // InternalQVTimperative.g:12258:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
    public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12261:28: (this_INT_0= RULE_INT )
            // InternalQVTimperative.g:12262:5: this_INT_0= RULE_INT
            {
            this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_INT_0);

            }
            if ( state.backtracking==0 ) {

                  newLeafNode(this_INT_0, grammarAccess.getLOWERAccess().getINTTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLOWER"


    // $ANTLR start "entryRuleNUMBER_LITERAL"
    // InternalQVTimperative.g:12277:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
    public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNUMBER_LITERAL = null;


        try {
            // InternalQVTimperative.g:12278:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
            // InternalQVTimperative.g:12279:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNUMBER_LITERAL=ruleNUMBER_LITERAL();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNUMBER_LITERAL.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNUMBER_LITERAL"


    // $ANTLR start "ruleNUMBER_LITERAL"
    // InternalQVTimperative.g:12286:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
    public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12289:28: (this_INT_0= RULE_INT )
            // InternalQVTimperative.g:12290:5: this_INT_0= RULE_INT
            {
            this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_INT_0);

            }
            if ( state.backtracking==0 ) {

                  newLeafNode(this_INT_0, grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNUMBER_LITERAL"


    // $ANTLR start "entryRuleStringLiteral"
    // InternalQVTimperative.g:12305:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
    public final String entryRuleStringLiteral() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleStringLiteral = null;


        try {
            // InternalQVTimperative.g:12306:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
            // InternalQVTimperative.g:12307:2: iv_ruleStringLiteral= ruleStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStringLiteralRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStringLiteral=ruleStringLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStringLiteral.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStringLiteral"


    // $ANTLR start "ruleStringLiteral"
    // InternalQVTimperative.g:12314:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
    public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SINGLE_QUOTED_STRING_0=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12317:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalQVTimperative.g:12318:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
            {
            this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_SINGLE_QUOTED_STRING_0);

            }
            if ( state.backtracking==0 ) {

                  newLeafNode(this_SINGLE_QUOTED_STRING_0, grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStringLiteral"


    // $ANTLR start "entryRuleUPPER"
    // InternalQVTimperative.g:12333:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
    public final String entryRuleUPPER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUPPER = null;


        try {
            // InternalQVTimperative.g:12334:2: (iv_ruleUPPER= ruleUPPER EOF )
            // InternalQVTimperative.g:12335:2: iv_ruleUPPER= ruleUPPER EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUPPERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUPPER=ruleUPPER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUPPER.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUPPER"


    // $ANTLR start "ruleUPPER"
    // InternalQVTimperative.g:12342:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
    public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;
        Token kw=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12345:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
            // InternalQVTimperative.g:12346:1: (this_INT_0= RULE_INT | kw= '*' )
            {
            // InternalQVTimperative.g:12346:1: (this_INT_0= RULE_INT | kw= '*' )
            int alt261=2;
            int LA261_0 = input.LA(1);

            if ( (LA261_0==RULE_INT) ) {
                alt261=1;
            }
            else if ( (LA261_0==42) ) {
                alt261=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 261, 0, input);

                throw nvae;
            }
            switch (alt261) {
                case 1 :
                    // InternalQVTimperative.g:12346:6: this_INT_0= RULE_INT
                    {
                    this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		current.merge(this_INT_0);

                    }
                    if ( state.backtracking==0 ) {

                          newLeafNode(this_INT_0, grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTimperative.g:12355:2: kw= '*'
                    {
                    kw=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUPPERAccess().getAsteriskKeyword_1());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUPPER"


    // $ANTLR start "entryRuleURI"
    // InternalQVTimperative.g:12368:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
    public final String entryRuleURI() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleURI = null;


        try {
            // InternalQVTimperative.g:12369:2: (iv_ruleURI= ruleURI EOF )
            // InternalQVTimperative.g:12370:2: iv_ruleURI= ruleURI EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURI=ruleURI();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleURI.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleURI"


    // $ANTLR start "ruleURI"
    // InternalQVTimperative.g:12377:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
    public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SINGLE_QUOTED_STRING_0=null;

         enterRule();

        try {
            // InternalQVTimperative.g:12380:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalQVTimperative.g:12381:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
            {
            this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_SINGLE_QUOTED_STRING_0);

            }
            if ( state.backtracking==0 ) {

                  newLeafNode(this_SINGLE_QUOTED_STRING_0, grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {
               leaveRule();
            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleURI"

    // $ANTLR start synpred36_InternalQVTimperative
    public final void synpred36_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_DeclareStatementCS_1 = null;


        // InternalQVTimperative.g:1468:2: (this_DeclareStatementCS_1= ruleDeclareStatementCS )
        // InternalQVTimperative.g:1468:2: this_DeclareStatementCS_1= ruleDeclareStatementCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_DeclareStatementCS_1=ruleDeclareStatementCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred36_InternalQVTimperative

    // $ANTLR start synpred37_InternalQVTimperative
    public final void synpred37_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_DeclareStatementCS_2 = null;


        // InternalQVTimperative.g:1481:2: (this_DeclareStatementCS_2= ruleDeclareStatementCS )
        // InternalQVTimperative.g:1481:2: this_DeclareStatementCS_2= ruleDeclareStatementCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_DeclareStatementCS_2=ruleDeclareStatementCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred37_InternalQVTimperative

    // $ANTLR start synpred38_InternalQVTimperative
    public final void synpred38_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_CheckStatementCS_3 = null;


        // InternalQVTimperative.g:1494:2: (this_CheckStatementCS_3= ruleCheckStatementCS )
        // InternalQVTimperative.g:1494:2: this_CheckStatementCS_3= ruleCheckStatementCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_CheckStatementCS_3=ruleCheckStatementCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred38_InternalQVTimperative

    // $ANTLR start synpred82_InternalQVTimperative
    public final void synpred82_InternalQVTimperative_fragment() throws RecognitionException {
        Token lv_isCheck_0_0=null;

        // InternalQVTimperative.g:3157:1: ( (lv_isCheck_0_0= 'check' ) )
        // InternalQVTimperative.g:3157:1: (lv_isCheck_0_0= 'check' )
        {
        // InternalQVTimperative.g:3157:1: (lv_isCheck_0_0= 'check' )
        // InternalQVTimperative.g:3158:3: lv_isCheck_0_0= 'check'
        {
        lv_isCheck_0_0=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred82_InternalQVTimperative

    // $ANTLR start synpred122_InternalQVTimperative
    public final void synpred122_InternalQVTimperative_fragment() throws RecognitionException {
        AntlrDatatypeRuleToken this_QVTbaseUnrestrictedName_1 = null;


        // InternalQVTimperative.g:3821:5: (this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName )
        // InternalQVTimperative.g:3821:5: this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName
        {
        if ( state.backtracking==0 ) {

                  newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTbaseUnrestrictedNameParserRuleCall_1());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_QVTbaseUnrestrictedName_1=ruleQVTbaseUnrestrictedName();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred122_InternalQVTimperative

    // $ANTLR start synpred357_InternalQVTimperative
    public final void synpred357_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPatternGuard_3_0 = null;


        // InternalQVTimperative.g:9273:4: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )
        // InternalQVTimperative.g:9273:4: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
        {
        otherlv_2=(Token)match(input,35,FollowSets000.FOLLOW_8); if (state.failed) return ;
        // InternalQVTimperative.g:9277:1: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
        // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
        {
        // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
        // InternalQVTimperative.g:9279:3: lv_ownedPatternGuard_3_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_58);
        lv_ownedPatternGuard_3_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred357_InternalQVTimperative

    // $ANTLR start synpred358_InternalQVTimperative
    public final void synpred358_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedCurlyBracketedClause_1_0 = null;

        EObject lv_ownedPatternGuard_3_0 = null;


        // InternalQVTimperative.g:9255:3: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )
        // InternalQVTimperative.g:9255:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
        {
        // InternalQVTimperative.g:9255:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) )
        // InternalQVTimperative.g:9256:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
        {
        // InternalQVTimperative.g:9256:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
        // InternalQVTimperative.g:9257:3: lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());

        }
        pushFollow(FollowSets000.FOLLOW_99);
        lv_ownedCurlyBracketedClause_1_0=ruleCurlyBracketedClauseCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTimperative.g:9273:2: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
        int alt348=2;
        int LA348_0 = input.LA(1);

        if ( (LA348_0==35) ) {
            alt348=1;
        }
        switch (alt348) {
            case 1 :
                // InternalQVTimperative.g:9273:4: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
                {
                otherlv_2=(Token)match(input,35,FollowSets000.FOLLOW_8); if (state.failed) return ;
                // InternalQVTimperative.g:9277:1: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
                // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                {
                // InternalQVTimperative.g:9278:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                // InternalQVTimperative.g:9279:3: lv_ownedPatternGuard_3_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_58);
                lv_ownedPatternGuard_3_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;

                }
                break;

        }


        }
    }
    // $ANTLR end synpred358_InternalQVTimperative

    // $ANTLR start synpred360_InternalQVTimperative
    public final void synpred360_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_TypeLiteralCS_1 = null;


        // InternalQVTimperative.g:9334:2: (this_TypeLiteralCS_1= ruleTypeLiteralCS )
        // InternalQVTimperative.g:9334:2: this_TypeLiteralCS_1= ruleTypeLiteralCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TypeLiteralCS_1=ruleTypeLiteralCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred360_InternalQVTimperative

    // $ANTLR start synpred363_InternalQVTimperative
    public final void synpred363_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_PrefixedPrimaryExpCS_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedRight_3_0 = null;


        // InternalQVTimperative.g:9430:2: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) )
        // InternalQVTimperative.g:9430:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        {
        // InternalQVTimperative.g:9430:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        // InternalQVTimperative.g:9431:2: this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_135);
        this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

        state._fsp--;
        if (state.failed) return ;
        // InternalQVTimperative.g:9442:1: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        int alt349=2;
        int LA349_0 = input.LA(1);

        if ( (LA349_0==42||LA349_0==53||LA349_0==61||LA349_0==106||(LA349_0>=109 && LA349_0<=126)) ) {
            alt349=1;
        }
        switch (alt349) {
            case 1 :
                // InternalQVTimperative.g:9442:2: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                {
                // InternalQVTimperative.g:9442:2: ()
                // InternalQVTimperative.g:9443:2:
                {
                if ( state.backtracking==0 ) {

                  	  /* */

                }

                }

                // InternalQVTimperative.g:9451:2: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                // InternalQVTimperative.g:9452:1: (lv_name_2_0= ruleBinaryOperatorName )
                {
                // InternalQVTimperative.g:9452:1: (lv_name_2_0= ruleBinaryOperatorName )
                // InternalQVTimperative.g:9453:3: lv_name_2_0= ruleBinaryOperatorName
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_8);
                lv_name_2_0=ruleBinaryOperatorName();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalQVTimperative.g:9469:2: ( (lv_ownedRight_3_0= ruleExpCS ) )
                // InternalQVTimperative.g:9470:1: (lv_ownedRight_3_0= ruleExpCS )
                {
                // InternalQVTimperative.g:9470:1: (lv_ownedRight_3_0= ruleExpCS )
                // InternalQVTimperative.g:9471:3: lv_ownedRight_3_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedRight_3_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred363_InternalQVTimperative

    // $ANTLR start synpred370_InternalQVTimperative
    public final void synpred370_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_TupleLiteralExpCS_4 = null;


        // InternalQVTimperative.g:9732:2: (this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS )
        // InternalQVTimperative.g:9732:2: this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TupleLiteralExpCS_4=ruleTupleLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred370_InternalQVTimperative

    // $ANTLR start synpred371_InternalQVTimperative
    public final void synpred371_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_MapLiteralExpCS_5 = null;


        // InternalQVTimperative.g:9745:2: (this_MapLiteralExpCS_5= ruleMapLiteralExpCS )
        // InternalQVTimperative.g:9745:2: this_MapLiteralExpCS_5= ruleMapLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_MapLiteralExpCS_5=ruleMapLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred371_InternalQVTimperative

    // $ANTLR start synpred372_InternalQVTimperative
    public final void synpred372_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_CollectionLiteralExpCS_6 = null;


        // InternalQVTimperative.g:9758:2: (this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS )
        // InternalQVTimperative.g:9758:2: this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_CollectionLiteralExpCS_6=ruleCollectionLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred372_InternalQVTimperative

    // $ANTLR start synpred374_InternalQVTimperative
    public final void synpred374_InternalQVTimperative_fragment() throws RecognitionException {
        EObject this_TypeLiteralExpCS_8 = null;


        // InternalQVTimperative.g:9784:2: (this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS )
        // InternalQVTimperative.g:9784:2: this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TypeLiteralExpCS_8=ruleTypeLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred374_InternalQVTimperative

    // $ANTLR start synpred387_InternalQVTimperative
    public final void synpred387_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedCoIterator_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;


        // InternalQVTimperative.g:10213:3: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) )
        // InternalQVTimperative.g:10213:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        {
        // InternalQVTimperative.g:10213:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        // InternalQVTimperative.g:10213:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        {
        otherlv_1=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
        // InternalQVTimperative.g:10217:1: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
        // InternalQVTimperative.g:10218:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        {
        // InternalQVTimperative.g:10218:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        // InternalQVTimperative.g:10219:3: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_146);
        lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTimperative.g:10235:2: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        int alt354=2;
        int LA354_0 = input.LA(1);

        if ( (LA354_0==53) ) {
            alt354=1;
        }
        switch (alt354) {
            case 1 :
                // InternalQVTimperative.g:10235:4: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                {
                otherlv_3=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return ;
                // InternalQVTimperative.g:10239:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                // InternalQVTimperative.g:10240:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                {
                // InternalQVTimperative.g:10240:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                // InternalQVTimperative.g:10241:3: lv_ownedInitExpression_4_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_4_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred387_InternalQVTimperative

    // $ANTLR start synpred390_InternalQVTimperative
    public final void synpred390_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        EObject lv_ownedType_6_0 = null;

        EObject lv_ownedCoIterator_8_0 = null;

        EObject lv_ownedInitExpression_10_0 = null;


        // InternalQVTimperative.g:10258:6: ( (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) )
        // InternalQVTimperative.g:10258:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        {
        // InternalQVTimperative.g:10258:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        // InternalQVTimperative.g:10258:8: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
        {
        otherlv_5=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return ;
        // InternalQVTimperative.g:10262:1: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
        // InternalQVTimperative.g:10263:1: (lv_ownedType_6_0= ruleTypeExpCS )
        {
        // InternalQVTimperative.g:10263:1: (lv_ownedType_6_0= ruleTypeExpCS )
        // InternalQVTimperative.g:10264:3: lv_ownedType_6_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_147);
        lv_ownedType_6_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTimperative.g:10280:2: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
        int alt355=2;
        int LA355_0 = input.LA(1);

        if ( (LA355_0==144) ) {
            alt355=1;
        }
        switch (alt355) {
            case 1 :
                // InternalQVTimperative.g:10280:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_7=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTimperative.g:10284:1: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                // InternalQVTimperative.g:10285:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTimperative.g:10285:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                // InternalQVTimperative.g:10286:3: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_146);
                lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTimperative.g:10302:4: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
        int alt356=2;
        int LA356_0 = input.LA(1);

        if ( (LA356_0==53) ) {
            alt356=1;
        }
        switch (alt356) {
            case 1 :
                // InternalQVTimperative.g:10302:6: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                {
                otherlv_9=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return ;
                // InternalQVTimperative.g:10306:1: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                // InternalQVTimperative.g:10307:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                {
                // InternalQVTimperative.g:10307:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                // InternalQVTimperative.g:10308:3: lv_ownedInitExpression_10_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_10_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred390_InternalQVTimperative

    // $ANTLR start synpred393_InternalQVTimperative
    public final void synpred393_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        EObject lv_ownedType_12_0 = null;

        EObject lv_ownedCoIterator_14_0 = null;

        EObject lv_ownedInitExpression_16_0 = null;


        // InternalQVTimperative.g:10325:6: ( ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )
        // InternalQVTimperative.g:10325:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        {
        // InternalQVTimperative.g:10325:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        // InternalQVTimperative.g:10325:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        {
        // InternalQVTimperative.g:10325:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
        int alt357=2;
        int LA357_0 = input.LA(1);

        if ( (LA357_0==24) ) {
            alt357=1;
        }
        switch (alt357) {
            case 1 :
                // InternalQVTimperative.g:10325:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                {
                otherlv_11=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return ;
                // InternalQVTimperative.g:10329:1: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                // InternalQVTimperative.g:10330:1: (lv_ownedType_12_0= ruleTypeExpCS )
                {
                // InternalQVTimperative.g:10330:1: (lv_ownedType_12_0= ruleTypeExpCS )
                // InternalQVTimperative.g:10331:3: lv_ownedType_12_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_148);
                lv_ownedType_12_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTimperative.g:10347:4: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
        int alt358=2;
        int LA358_0 = input.LA(1);

        if ( (LA358_0==144) ) {
            alt358=1;
        }
        switch (alt358) {
            case 1 :
                // InternalQVTimperative.g:10347:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_13=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTimperative.g:10351:1: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                // InternalQVTimperative.g:10352:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTimperative.g:10352:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                // InternalQVTimperative.g:10353:3: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_44);
                lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_15=(Token)match(input,49,FollowSets000.FOLLOW_8); if (state.failed) return ;
        // InternalQVTimperative.g:10373:1: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        // InternalQVTimperative.g:10374:1: (lv_ownedInitExpression_16_0= ruleExpCS )
        {
        // InternalQVTimperative.g:10374:1: (lv_ownedInitExpression_16_0= ruleExpCS )
        // InternalQVTimperative.g:10375:3: lv_ownedInitExpression_16_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedInitExpression_16_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred393_InternalQVTimperative

    // $ANTLR start synpred398_InternalQVTimperative
    public final void synpred398_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedCoIterator_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


        // InternalQVTimperative.g:10566:3: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) )
        // InternalQVTimperative.g:10566:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        {
        // InternalQVTimperative.g:10566:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        // InternalQVTimperative.g:10566:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        {
        otherlv_2=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
        // InternalQVTimperative.g:10570:1: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
        // InternalQVTimperative.g:10571:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        {
        // InternalQVTimperative.g:10571:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        // InternalQVTimperative.g:10572:3: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_146);
        lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTimperative.g:10588:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        int alt366=2;
        int LA366_0 = input.LA(1);

        if ( (LA366_0==53) ) {
            alt366=1;
        }
        switch (alt366) {
            case 1 :
                // InternalQVTimperative.g:10588:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                {
                otherlv_4=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return ;
                // InternalQVTimperative.g:10592:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                // InternalQVTimperative.g:10593:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                {
                // InternalQVTimperative.g:10593:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                // InternalQVTimperative.g:10594:3: lv_ownedInitExpression_5_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_5_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred398_InternalQVTimperative

    // $ANTLR start synpred401_InternalQVTimperative
    public final void synpred401_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedCoIterator_9_0 = null;

        EObject lv_ownedInitExpression_11_0 = null;


        // InternalQVTimperative.g:10611:6: ( (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) )
        // InternalQVTimperative.g:10611:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        {
        // InternalQVTimperative.g:10611:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        // InternalQVTimperative.g:10611:8: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
        {
        otherlv_6=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return ;
        // InternalQVTimperative.g:10615:1: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
        // InternalQVTimperative.g:10616:1: (lv_ownedType_7_0= ruleTypeExpCS )
        {
        // InternalQVTimperative.g:10616:1: (lv_ownedType_7_0= ruleTypeExpCS )
        // InternalQVTimperative.g:10617:3: lv_ownedType_7_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_147);
        lv_ownedType_7_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTimperative.g:10633:2: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
        int alt367=2;
        int LA367_0 = input.LA(1);

        if ( (LA367_0==144) ) {
            alt367=1;
        }
        switch (alt367) {
            case 1 :
                // InternalQVTimperative.g:10633:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_8=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTimperative.g:10637:1: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                // InternalQVTimperative.g:10638:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTimperative.g:10638:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                // InternalQVTimperative.g:10639:3: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_146);
                lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTimperative.g:10655:4: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
        int alt368=2;
        int LA368_0 = input.LA(1);

        if ( (LA368_0==53) ) {
            alt368=1;
        }
        switch (alt368) {
            case 1 :
                // InternalQVTimperative.g:10655:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                {
                otherlv_10=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return ;
                // InternalQVTimperative.g:10659:1: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                // InternalQVTimperative.g:10660:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                {
                // InternalQVTimperative.g:10660:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                // InternalQVTimperative.g:10661:3: lv_ownedInitExpression_11_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_11_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred401_InternalQVTimperative

    // $ANTLR start synpred404_InternalQVTimperative
    public final void synpred404_InternalQVTimperative_fragment() throws RecognitionException {
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedCoIterator_15_0 = null;

        EObject lv_ownedInitExpression_17_0 = null;


        // InternalQVTimperative.g:10678:6: ( ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )
        // InternalQVTimperative.g:10678:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        {
        // InternalQVTimperative.g:10678:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        // InternalQVTimperative.g:10678:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        {
        // InternalQVTimperative.g:10678:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
        int alt369=2;
        int LA369_0 = input.LA(1);

        if ( (LA369_0==24) ) {
            alt369=1;
        }
        switch (alt369) {
            case 1 :
                // InternalQVTimperative.g:10678:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                {
                otherlv_12=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return ;
                // InternalQVTimperative.g:10682:1: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                // InternalQVTimperative.g:10683:1: (lv_ownedType_13_0= ruleTypeExpCS )
                {
                // InternalQVTimperative.g:10683:1: (lv_ownedType_13_0= ruleTypeExpCS )
                // InternalQVTimperative.g:10684:3: lv_ownedType_13_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_148);
                lv_ownedType_13_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTimperative.g:10700:4: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
        int alt370=2;
        int LA370_0 = input.LA(1);

        if ( (LA370_0==144) ) {
            alt370=1;
        }
        switch (alt370) {
            case 1 :
                // InternalQVTimperative.g:10700:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_14=(Token)match(input,144,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTimperative.g:10704:1: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                // InternalQVTimperative.g:10705:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTimperative.g:10705:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                // InternalQVTimperative.g:10706:3: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_44);
                lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_16=(Token)match(input,49,FollowSets000.FOLLOW_8); if (state.failed) return ;
        // InternalQVTimperative.g:10726:1: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        // InternalQVTimperative.g:10727:1: (lv_ownedInitExpression_17_0= ruleExpCS )
        {
        // InternalQVTimperative.g:10727:1: (lv_ownedInitExpression_17_0= ruleExpCS )
        // InternalQVTimperative.g:10728:3: lv_ownedInitExpression_17_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedInitExpression_17_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred404_InternalQVTimperative

    // Delegated rules

    public final boolean synpred374_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred374_InternalQVTimperative_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 synpred82_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred82_InternalQVTimperative_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 synpred370_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred370_InternalQVTimperative_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 synpred404_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred404_InternalQVTimperative_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 synpred390_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred390_InternalQVTimperative_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 synpred358_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred358_InternalQVTimperative_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 synpred372_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred372_InternalQVTimperative_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_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalQVTimperative_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 synpred36_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred36_InternalQVTimperative_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 synpred371_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred371_InternalQVTimperative_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 synpred357_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred357_InternalQVTimperative_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 synpred387_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred387_InternalQVTimperative_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 synpred363_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred363_InternalQVTimperative_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 synpred398_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred398_InternalQVTimperative_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 synpred393_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred393_InternalQVTimperative_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 synpred122_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred122_InternalQVTimperative_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 synpred401_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred401_InternalQVTimperative_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 synpred360_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred360_InternalQVTimperative_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_InternalQVTimperative() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalQVTimperative_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 DFA10 dfa10 = new DFA10(this);
    protected DFA13 dfa13 = new DFA13(this);
    protected DFA28 dfa28 = new DFA28(this);
    protected DFA29 dfa29 = new DFA29(this);
    protected DFA33 dfa33 = new DFA33(this);
    protected DFA41 dfa41 = new DFA41(this);
    protected DFA42 dfa42 = new DFA42(this);
    protected DFA50 dfa50 = new DFA50(this);
    protected DFA56 dfa56 = new DFA56(this);
    protected DFA66 dfa66 = new DFA66(this);
    protected DFA71 dfa71 = new DFA71(this);
    protected DFA73 dfa73 = new DFA73(this);
    protected DFA190 dfa190 = new DFA190(this);
    protected DFA193 dfa193 = new DFA193(this);
    protected DFA206 dfa206 = new DFA206(this);
    protected DFA205 dfa205 = new DFA205(this);
    protected DFA207 dfa207 = new DFA207(this);
    protected DFA210 dfa210 = new DFA210(this);
    protected DFA213 dfa213 = new DFA213(this);
    protected DFA216 dfa216 = new DFA216(this);
    protected DFA229 dfa229 = new DFA229(this);
    protected DFA238 dfa238 = new DFA238(this);
    protected DFA242 dfa242 = new DFA242(this);
    static final String dfa_1s = "\u0119\uffff";
    static final String dfa_2s = "\1\21\1\7\2\uffff\75\22\2\7\u0089\22\1\7\114\22";
    static final String dfa_3s = "\1\74\1\151\2\uffff\75\74\1\u008d\1\151\u0089\74\1\u008d\114\74";
    static final String dfa_4s = "\2\uffff\1\1\1\2\u0115\uffff";
    static final String dfa_5s = "\u0119\uffff}>";
    static final String[] dfa_6s = {
            "\1\1\40\uffff\2\2\7\uffff\2\3",
            "\1\4\1\5\10\uffff\1\64\1\uffff\1\42\2\uffff\1\44\1\43\1\uffff\1\72\1\45\2\uffff\1\47\1\77\1\54\1\51\1\55\1\65\4\uffff\1\73\3\uffff\1\60\1\61\1\46\1\56\1\57\1\52\1\uffff\1\50\1\62\1\66\1\uffff\1\36\1\67\2\uffff\1\53\1\63\1\70\1\uffff\1\76\1\71\1\75\1\74\1\100\1\34\1\14\1\7\1\15\1\uffff\1\21\1\uffff\1\26\1\uffff\1\31\2\uffff\1\37\1\uffff\1\40\1\uffff\1\41\1\uffff\1\22\1\16\1\27\1\13\1\33\1\uffff\1\17\1\24\1\25\1\35\1\10\1\30\1\uffff\1\12\1\uffff\1\32\1\uffff\1\6\1\11\1\20\1\23",
            "",
            "",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\103\1\104\10\uffff\1\163\1\uffff\1\141\2\uffff\1\143\1\142\1\uffff\1\171\1\144\2\uffff\1\146\1\176\1\153\1\150\1\154\1\164\4\uffff\1\172\3\uffff\1\157\1\160\1\145\1\155\1\156\1\151\1\uffff\1\147\1\161\1\165\1\uffff\1\135\1\166\2\uffff\1\152\1\162\1\167\1\uffff\1\175\1\170\1\174\1\173\1\177\1\133\1\113\1\106\1\114\1\uffff\1\120\1\uffff\1\125\1\uffff\1\130\2\uffff\1\136\1\uffff\1\137\1\uffff\1\140\1\uffff\1\121\1\115\1\126\1\112\1\132\1\uffff\1\116\1\123\1\124\1\134\1\107\1\127\1\uffff\1\111\1\uffff\1\131\1\uffff\1\105\1\110\1\117\1\122\25\uffff\1\u008d\1\u008e\1\u0085\1\u0086\1\u0087\1\u0088\1\u0089\1\u008a\1\u008b\1\u008c\1\u0080\1\u0081\1\u0082\1\u0083\1\u0084",
            "\1\u008f\1\u0090\10\uffff\1\u00bf\1\uffff\1\u00ad\2\uffff\1\u00af\1\u00ae\1\uffff\1\u00c5\1\u00b0\2\uffff\1\u00b2\1\u00ca\1\u00b7\1\u00b4\1\u00b8\1\u00c0\4\uffff\1\u00c6\3\uffff\1\u00bb\1\u00bc\1\u00b1\1\u00b9\1\u00ba\1\u00b5\1\uffff\1\u00b3\1\u00bd\1\u00c1\1\uffff\1\u00a9\1\u00c2\2\uffff\1\u00b6\1\u00be\1\u00c3\1\uffff\1\u00c9\1\u00c4\1\u00c8\1\u00c7\1\u00cb\1\u00a7\1\u0097\1\u0092\1\u0098\1\uffff\1\u009c\1\uffff\1\u00a1\1\uffff\1\u00a4\2\uffff\1\u00aa\1\uffff\1\u00ab\1\uffff\1\u00ac\1\uffff\1\u009d\1\u0099\1\u00a2\1\u0096\1\u00a6\1\uffff\1\u009a\1\u009f\1\u00a0\1\u00a8\1\u0093\1\u00a3\1\uffff\1\u0095\1\uffff\1\u00a5\1\uffff\1\u0091\1\u0094\1\u009b\1\u009e",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\101\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\u00cd\1\u00ce\10\uffff\1\u00fd\1\uffff\1\u00eb\2\uffff\1\u00ed\1\u00ec\1\uffff\1\u0103\1\u00ee\2\uffff\1\u00f0\1\u0108\1\u00f5\1\u00f2\1\u00f6\1\u00fe\4\uffff\1\u0104\3\uffff\1\u00f9\1\u00fa\1\u00ef\1\u00f7\1\u00f8\1\u00f3\1\uffff\1\u00f1\1\u00fb\1\u00ff\1\uffff\1\u00e7\1\u0100\2\uffff\1\u00f4\1\u00fc\1\u0101\1\uffff\1\u0107\1\u0102\1\u0106\1\u0105\1\u0109\1\u00e5\1\u00d5\1\u00d0\1\u00d6\1\uffff\1\u00da\1\uffff\1\u00df\1\uffff\1\u00e2\2\uffff\1\u00e8\1\uffff\1\u00e9\1\uffff\1\u00ea\1\uffff\1\u00db\1\u00d7\1\u00e0\1\u00d4\1\u00e4\1\uffff\1\u00d8\1\u00dd\1\u00de\1\u00e6\1\u00d1\1\u00e1\1\uffff\1\u00d3\1\uffff\1\u00e3\1\uffff\1\u00cf\1\u00d2\1\u00d9\1\u00dc\25\uffff\1\u0117\1\u0118\1\u010f\1\u0110\1\u0111\1\u0112\1\u0113\1\u0114\1\u0115\1\u0116\1\u010a\1\u010b\1\u010c\1\u010d\1\u010e",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3",
            "\1\102\26\uffff\1\u00cc\10\uffff\2\2\7\uffff\2\3"
    };

    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);

    class DFA10 extends DFA {

        public DFA10(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 10;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_3;
            this.accept = dfa_4;
            this.special = dfa_5;
            this.transition = dfa_6;
        }
        public String getDescription() {
            return "566:1: (this_NewStatementCS_0= ruleNewStatementCS | this_SetStatementCS_1= ruleSetStatementCS )";
        }
    }
    static final String dfa_7s = "\u011a\uffff";
    static final String dfa_8s = "\1\21\1\7\3\uffff\75\22\2\7\u0089\22\1\7\114\22";
    static final String dfa_9s = "\1\60\1\151\3\uffff\75\60\1\u008d\1\151\u0089\60\1\u008d\114\60";
    static final String dfa_10s = "\2\uffff\1\1\1\2\1\3\u0115\uffff";
    static final String dfa_11s = "\u011a\uffff}>";
    static final String[] dfa_12s = {
            "\1\1\1\uffff\1\2\31\uffff\3\3\1\4",
            "\1\5\1\6\10\uffff\1\65\1\uffff\1\43\2\uffff\1\45\1\44\1\uffff\1\73\1\46\2\uffff\1\50\1\100\1\55\1\52\1\56\1\66\4\uffff\1\74\3\uffff\1\61\1\62\1\47\1\57\1\60\1\53\1\uffff\1\51\1\63\1\67\1\uffff\1\37\1\70\2\uffff\1\54\1\64\1\71\1\uffff\1\77\1\72\1\76\1\75\1\101\1\35\1\15\1\10\1\16\1\uffff\1\22\1\uffff\1\27\1\uffff\1\32\2\uffff\1\40\1\uffff\1\41\1\uffff\1\42\1\uffff\1\23\1\17\1\30\1\14\1\34\1\uffff\1\20\1\25\1\26\1\36\1\11\1\31\1\uffff\1\13\1\uffff\1\33\1\uffff\1\7\1\12\1\21\1\24",
            "",
            "",
            "",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\104\1\105\10\uffff\1\164\1\uffff\1\142\2\uffff\1\144\1\143\1\uffff\1\172\1\145\2\uffff\1\147\1\177\1\154\1\151\1\155\1\165\4\uffff\1\173\3\uffff\1\160\1\161\1\146\1\156\1\157\1\152\1\uffff\1\150\1\162\1\166\1\uffff\1\136\1\167\2\uffff\1\153\1\163\1\170\1\uffff\1\176\1\171\1\175\1\174\1\u0080\1\134\1\114\1\107\1\115\1\uffff\1\121\1\uffff\1\126\1\uffff\1\131\2\uffff\1\137\1\uffff\1\140\1\uffff\1\141\1\uffff\1\122\1\116\1\127\1\113\1\133\1\uffff\1\117\1\124\1\125\1\135\1\110\1\130\1\uffff\1\112\1\uffff\1\132\1\uffff\1\106\1\111\1\120\1\123\25\uffff\1\u008e\1\u008f\1\u0086\1\u0087\1\u0088\1\u0089\1\u008a\1\u008b\1\u008c\1\u008d\1\u0081\1\u0082\1\u0083\1\u0084\1\u0085",
            "\1\u0090\1\u0091\10\uffff\1\u00c0\1\uffff\1\u00ae\2\uffff\1\u00b0\1\u00af\1\uffff\1\u00c6\1\u00b1\2\uffff\1\u00b3\1\u00cb\1\u00b8\1\u00b5\1\u00b9\1\u00c1\4\uffff\1\u00c7\3\uffff\1\u00bc\1\u00bd\1\u00b2\1\u00ba\1\u00bb\1\u00b6\1\uffff\1\u00b4\1\u00be\1\u00c2\1\uffff\1\u00aa\1\u00c3\2\uffff\1\u00b7\1\u00bf\1\u00c4\1\uffff\1\u00ca\1\u00c5\1\u00c9\1\u00c8\1\u00cc\1\u00a8\1\u0098\1\u0093\1\u0099\1\uffff\1\u009d\1\uffff\1\u00a2\1\uffff\1\u00a5\2\uffff\1\u00ab\1\uffff\1\u00ac\1\uffff\1\u00ad\1\uffff\1\u009e\1\u009a\1\u00a3\1\u0097\1\u00a7\1\uffff\1\u009b\1\u00a0\1\u00a1\1\u00a9\1\u0094\1\u00a4\1\uffff\1\u0096\1\uffff\1\u00a6\1\uffff\1\u0092\1\u0095\1\u009c\1\u009f",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\102\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\u00ce\1\u00cf\10\uffff\1\u00fe\1\uffff\1\u00ec\2\uffff\1\u00ee\1\u00ed\1\uffff\1\u0104\1\u00ef\2\uffff\1\u00f1\1\u0109\1\u00f6\1\u00f3\1\u00f7\1\u00ff\4\uffff\1\u0105\3\uffff\1\u00fa\1\u00fb\1\u00f0\1\u00f8\1\u00f9\1\u00f4\1\uffff\1\u00f2\1\u00fc\1\u0100\1\uffff\1\u00e8\1\u0101\2\uffff\1\u00f5\1\u00fd\1\u0102\1\uffff\1\u0108\1\u0103\1\u0107\1\u0106\1\u010a\1\u00e6\1\u00d6\1\u00d1\1\u00d7\1\uffff\1\u00db\1\uffff\1\u00e0\1\uffff\1\u00e3\2\uffff\1\u00e9\1\uffff\1\u00ea\1\uffff\1\u00eb\1\uffff\1\u00dc\1\u00d8\1\u00e1\1\u00d5\1\u00e5\1\uffff\1\u00d9\1\u00de\1\u00df\1\u00e7\1\u00d2\1\u00e2\1\uffff\1\u00d4\1\uffff\1\u00e4\1\uffff\1\u00d0\1\u00d3\1\u00da\1\u00dd\25\uffff\1\u0118\1\u0119\1\u0110\1\u0111\1\u0112\1\u0113\1\u0114\1\u0115\1\u0116\1\u0117\1\u010b\1\u010c\1\u010d\1\u010e\1\u010f",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4",
            "\1\103\1\2\25\uffff\1\u00cd\6\uffff\1\4"
    };

    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
    static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final short[] dfa_10 = DFA.unpackEncodedString(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[][] dfa_12 = unpackEncodedStringArray(dfa_12s);

    class DFA13 extends DFA {

        public DFA13(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 13;
            this.eot = dfa_7;
            this.eof = dfa_7;
            this.min = dfa_8;
            this.max = dfa_9;
            this.accept = dfa_10;
            this.special = dfa_11;
            this.transition = dfa_12;
        }
        public String getDescription() {
            return "703:1: (this_AddStatementCS_0= ruleAddStatementCS | this_MappingCallCS_1= ruleMappingCallCS | this_MappingLoopCS_2= ruleMappingLoopCS )";
        }
    }
    static final String dfa_13s = "\1\77\1\151\2\uffff\75\74\1\u008d\1\151\u0089\74\1\u008d\114\74";
    static final String dfa_14s = "\2\uffff\1\2\1\1\u0115\uffff";
    static final String[] dfa_15s = {
            "\1\1\1\uffff\1\2\5\uffff\2\3\2\uffff\2\3\5\uffff\1\2\10\uffff\4\2\1\uffff\2\2\7\uffff\2\2\2\uffff\1\3",
            "\1\4\1\5\10\uffff\1\64\1\uffff\1\42\2\uffff\1\44\1\43\1\uffff\1\72\1\45\2\uffff\1\47\1\77\1\54\1\51\1\55\1\65\4\uffff\1\73\3\uffff\1\60\1\61\1\46\1\56\1\57\1\52\1\uffff\1\50\1\62\1\66\1\uffff\1\36\1\67\2\uffff\1\53\1\63\1\70\1\uffff\1\76\1\71\1\75\1\74\1\100\1\34\1\14\1\7\1\15\1\uffff\1\21\1\uffff\1\26\1\uffff\1\31\2\uffff\1\37\1\uffff\1\40\1\uffff\1\41\1\uffff\1\22\1\16\1\27\1\13\1\33\1\uffff\1\17\1\24\1\25\1\35\1\10\1\30\1\uffff\1\12\1\uffff\1\32\1\uffff\1\6\1\11\1\20\1\23",
            "",
            "",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\103\1\104\10\uffff\1\163\1\uffff\1\141\2\uffff\1\143\1\142\1\uffff\1\171\1\144\2\uffff\1\146\1\176\1\153\1\150\1\154\1\164\4\uffff\1\172\3\uffff\1\157\1\160\1\145\1\155\1\156\1\151\1\uffff\1\147\1\161\1\165\1\uffff\1\135\1\166\2\uffff\1\152\1\162\1\167\1\uffff\1\175\1\170\1\174\1\173\1\177\1\133\1\113\1\106\1\114\1\uffff\1\120\1\uffff\1\125\1\uffff\1\130\2\uffff\1\136\1\uffff\1\137\1\uffff\1\140\1\uffff\1\121\1\115\1\126\1\112\1\132\1\uffff\1\116\1\123\1\124\1\134\1\107\1\127\1\uffff\1\111\1\uffff\1\131\1\uffff\1\105\1\110\1\117\1\122\25\uffff\1\u008d\1\u008e\1\u0085\1\u0086\1\u0087\1\u0088\1\u0089\1\u008a\1\u008b\1\u008c\1\u0080\1\u0081\1\u0082\1\u0083\1\u0084",
            "\1\u008f\1\u0090\10\uffff\1\u00bf\1\uffff\1\u00ad\2\uffff\1\u00af\1\u00ae\1\uffff\1\u00c5\1\u00b0\2\uffff\1\u00b2\1\u00ca\1\u00b7\1\u00b4\1\u00b8\1\u00c0\4\uffff\1\u00c6\3\uffff\1\u00bb\1\u00bc\1\u00b1\1\u00b9\1\u00ba\1\u00b5\1\uffff\1\u00b3\1\u00bd\1\u00c1\1\uffff\1\u00a9\1\u00c2\2\uffff\1\u00b6\1\u00be\1\u00c3\1\uffff\1\u00c9\1\u00c4\1\u00c8\1\u00c7\1\u00cb\1\u00a7\1\u0097\1\u0092\1\u0098\1\uffff\1\u009c\1\uffff\1\u00a1\1\uffff\1\u00a4\2\uffff\1\u00aa\1\uffff\1\u00ab\1\uffff\1\u00ac\1\uffff\1\u009d\1\u0099\1\u00a2\1\u0096\1\u00a6\1\uffff\1\u009a\1\u009f\1\u00a0\1\u00a8\1\u0093\1\u00a3\1\uffff\1\u0095\1\uffff\1\u00a5\1\uffff\1\u0091\1\u0094\1\u009b\1\u009e",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\101\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\u00cd\1\u00ce\10\uffff\1\u00fd\1\uffff\1\u00eb\2\uffff\1\u00ed\1\u00ec\1\uffff\1\u0103\1\u00ee\2\uffff\1\u00f0\1\u0108\1\u00f5\1\u00f2\1\u00f6\1\u00fe\4\uffff\1\u0104\3\uffff\1\u00f9\1\u00fa\1\u00ef\1\u00f7\1\u00f8\1\u00f3\1\uffff\1\u00f1\1\u00fb\1\u00ff\1\uffff\1\u00e7\1\u0100\2\uffff\1\u00f4\1\u00fc\1\u0101\1\uffff\1\u0107\1\u0102\1\u0106\1\u0105\1\u0109\1\u00e5\1\u00d5\1\u00d0\1\u00d6\1\uffff\1\u00da\1\uffff\1\u00df\1\uffff\1\u00e2\2\uffff\1\u00e8\1\uffff\1\u00e9\1\uffff\1\u00ea\1\uffff\1\u00db\1\u00d7\1\u00e0\1\u00d4\1\u00e4\1\uffff\1\u00d8\1\u00dd\1\u00de\1\u00e6\1\u00d1\1\u00e1\1\uffff\1\u00d3\1\uffff\1\u00e3\1\uffff\1\u00cf\1\u00d2\1\u00d9\1\u00dc\25\uffff\1\u0117\1\u0118\1\u010f\1\u0110\1\u0111\1\u0112\1\u0113\1\u0114\1\u0115\1\u0116\1\u010a\1\u010b\1\u010c\1\u010d\1\u010e",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2",
            "\1\102\1\2\11\uffff\2\3\12\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\2\7\uffff\2\2"
    };
    static final char[] dfa_13 = DFA.unpackEncodedStringToUnsignedChars(dfa_13s);
    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
    static final short[][] dfa_15 = unpackEncodedStringArray(dfa_15s);

    class DFA28 extends DFA {

        public DFA28(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 28;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_13;
            this.accept = dfa_14;
            this.special = dfa_5;
            this.transition = dfa_15;
        }
        public String getDescription() {
            return "()* loopback of 1182:3: ( (lv_ownedStatements_16_0= ruleGuardStatementCS ) )*";
        }
    }
    static final String[] dfa_16s = {
            "\1\1\1\uffff\1\2\20\uffff\1\2\10\uffff\4\2\1\uffff\2\3\7\uffff\2\3",
            "\1\4\1\5\10\uffff\1\64\1\uffff\1\42\2\uffff\1\44\1\43\1\uffff\1\72\1\45\2\uffff\1\47\1\77\1\54\1\51\1\55\1\65\4\uffff\1\73\3\uffff\1\60\1\61\1\46\1\56\1\57\1\52\1\uffff\1\50\1\62\1\66\1\uffff\1\36\1\67\2\uffff\1\53\1\63\1\70\1\uffff\1\76\1\71\1\75\1\74\1\100\1\34\1\14\1\7\1\15\1\uffff\1\21\1\uffff\1\26\1\uffff\1\31\2\uffff\1\37\1\uffff\1\40\1\uffff\1\41\1\uffff\1\22\1\16\1\27\1\13\1\33\1\uffff\1\17\1\24\1\25\1\35\1\10\1\30\1\uffff\1\12\1\uffff\1\32\1\uffff\1\6\1\11\1\20\1\23",
            "",
            "",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\103\1\104\10\uffff\1\163\1\uffff\1\141\2\uffff\1\143\1\142\1\uffff\1\171\1\144\2\uffff\1\146\1\176\1\153\1\150\1\154\1\164\4\uffff\1\172\3\uffff\1\157\1\160\1\145\1\155\1\156\1\151\1\uffff\1\147\1\161\1\165\1\uffff\1\135\1\166\2\uffff\1\152\1\162\1\167\1\uffff\1\175\1\170\1\174\1\173\1\177\1\133\1\113\1\106\1\114\1\uffff\1\120\1\uffff\1\125\1\uffff\1\130\2\uffff\1\136\1\uffff\1\137\1\uffff\1\140\1\uffff\1\121\1\115\1\126\1\112\1\132\1\uffff\1\116\1\123\1\124\1\134\1\107\1\127\1\uffff\1\111\1\uffff\1\131\1\uffff\1\105\1\110\1\117\1\122\25\uffff\1\u008d\1\u008e\1\u0085\1\u0086\1\u0087\1\u0088\1\u0089\1\u008a\1\u008b\1\u008c\1\u0080\1\u0081\1\u0082\1\u0083\1\u0084",
            "\1\u008f\1\u0090\10\uffff\1\u00bf\1\uffff\1\u00ad\2\uffff\1\u00af\1\u00ae\1\uffff\1\u00c5\1\u00b0\2\uffff\1\u00b2\1\u00ca\1\u00b7\1\u00b4\1\u00b8\1\u00c0\4\uffff\1\u00c6\3\uffff\1\u00bb\1\u00bc\1\u00b1\1\u00b9\1\u00ba\1\u00b5\1\uffff\1\u00b3\1\u00bd\1\u00c1\1\uffff\1\u00a9\1\u00c2\2\uffff\1\u00b6\1\u00be\1\u00c3\1\uffff\1\u00c9\1\u00c4\1\u00c8\1\u00c7\1\u00cb\1\u00a7\1\u0097\1\u0092\1\u0098\1\uffff\1\u009c\1\uffff\1\u00a1\1\uffff\1\u00a4\2\uffff\1\u00aa\1\uffff\1\u00ab\1\uffff\1\u00ac\1\uffff\1\u009d\1\u0099\1\u00a2\1\u0096\1\u00a6\1\uffff\1\u009a\1\u009f\1\u00a0\1\u00a8\1\u0093\1\u00a3\1\uffff\1\u0095\1\uffff\1\u00a5\1\uffff\1\u0091\1\u0094\1\u009b\1\u009e",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\101\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\u00cd\1\u00ce\10\uffff\1\u00fd\1\uffff\1\u00eb\2\uffff\1\u00ed\1\u00ec\1\uffff\1\u0103\1\u00ee\2\uffff\1\u00f0\1\u0108\1\u00f5\1\u00f2\1\u00f6\1\u00fe\4\uffff\1\u0104\3\uffff\1\u00f9\1\u00fa\1\u00ef\1\u00f7\1\u00f8\1\u00f3\1\uffff\1\u00f1\1\u00fb\1\u00ff\1\uffff\1\u00e7\1\u0100\2\uffff\1\u00f4\1\u00fc\1\u0101\1\uffff\1\u0107\1\u0102\1\u0106\1\u0105\1\u0109\1\u00e5\1\u00d5\1\u00d0\1\u00d6\1\uffff\1\u00da\1\uffff\1\u00df\1\uffff\1\u00e2\2\uffff\1\u00e8\1\uffff\1\u00e9\1\uffff\1\u00ea\1\uffff\1\u00db\1\u00d7\1\u00e0\1\u00d4\1\u00e4\1\uffff\1\u00d8\1\u00dd\1\u00de\1\u00e6\1\u00d1\1\u00e1\1\uffff\1\u00d3\1\uffff\1\u00e3\1\uffff\1\u00cf\1\u00d2\1\u00d9\1\u00dc\25\uffff\1\u0117\1\u0118\1\u010f\1\u0110\1\u0111\1\u0112\1\u0113\1\u0114\1\u0115\1\u0116\1\u010a\1\u010b\1\u010c\1\u010d\1\u010e",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3",
            "\1\102\1\2\25\uffff\1\u00cc\6\uffff\1\2\1\uffff\2\3\7\uffff\2\3"
    };
    static final short[][] dfa_16 = unpackEncodedStringArray(dfa_16s);

    class DFA29 extends DFA {

        public DFA29(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 29;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_3;
            this.accept = dfa_14;
            this.special = dfa_5;
            this.transition = dfa_16;
        }
        public String getDescription() {
            return "()* loopback of 1200:3: ( (lv_ownedStatements_17_0= ruleCommitStatementCS ) )*";
        }
    }
    static final String dfa_17s = "\12\uffff";
    static final String dfa_18s = "\1\21\2\uffff\3\0\4\uffff";
    static final String dfa_19s = "\1\77\2\uffff\3\0\4\uffff";
    static final String dfa_20s = "\1\uffff\1\1\4\uffff\1\5\1\2\1\3\1\4";
    static final String dfa_21s = "\3\uffff\1\0\1\1\1\2\4\uffff}>";
    static final String[] dfa_22s = {
            "\1\3\7\uffff\2\1\2\uffff\1\4\1\5\40\uffff\1\6",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final char[] dfa_18 = DFA.unpackEncodedStringToUnsignedChars(dfa_18s);
    static final char[] dfa_19 = DFA.unpackEncodedStringToUnsignedChars(dfa_19s);
    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final short[][] dfa_22 = unpackEncodedStringArray(dfa_22s);

    class DFA33 extends DFA {

        public DFA33(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 33;
            this.eot = dfa_17;
            this.eof = dfa_17;
            this.min = dfa_18;
            this.max = dfa_19;
            this.accept = dfa_20;
            this.special = dfa_21;
            this.transition = dfa_22;
        }
        public String getDescription() {
            return "1454:1: (this_BufferStatementCS_0= ruleBufferStatementCS | this_DeclareStatementCS_1= ruleDeclareStatementCS | this_DeclareStatementCS_2= ruleDeclareStatementCS | this_CheckStatementCS_3= ruleCheckStatementCS | this_SpeculateStatementCS_4= ruleSpeculateStatementCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA33_3 = input.LA(1);


                        int index33_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred36_InternalQVTimperative()) ) {s = 7;}

                        else if ( (synpred37_InternalQVTimperative()) ) {s = 8;}

                        else if ( (synpred38_InternalQVTimperative()) ) {s = 9;}


                        input.seek(index33_3);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA33_4 = input.LA(1);


                        int index33_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred36_InternalQVTimperative()) ) {s = 7;}

                        else if ( (synpred37_InternalQVTimperative()) ) {s = 8;}

                        else if ( (synpred38_InternalQVTimperative()) ) {s = 9;}


                        input.seek(index33_4);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA33_5 = input.LA(1);


                        int index33_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred36_InternalQVTimperative()) ) {s = 7;}

                        else if ( (synpred37_InternalQVTimperative()) ) {s = 8;}


                        input.seek(index33_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 33, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA41 extends DFA {

        public DFA41(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 41;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_13;
            this.accept = dfa_14;
            this.special = dfa_5;
            this.transition = dfa_15;
        }
        public String getDescription() {
            return "()* loopback of 1819:3: ( (lv_ownedStatements_10_0= ruleGuardStatementCS ) )*";
        }
    }

    class DFA42 extends DFA {

        public DFA42(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 42;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_3;
            this.accept = dfa_14;
            this.special = dfa_5;
            this.transition = dfa_16;
        }
        public String getDescription() {
            return "()* loopback of 1837:3: ( (lv_ownedStatements_11_0= ruleCommitStatementCS ) )*";
        }
    }
    static final String dfa_23s = "\u0083\uffff";
    static final String dfa_24s = "\1\7\43\26\1\7\31\26\4\uffff\40\45\1\7\13\45\1\7\15\45\1\4\2\45\1\4\1\7\1\4\1\7";
    static final String dfa_25s = "\1\151\43\76\1\151\31\76\4\uffff\40\76\1\151\13\76\1\151\15\76\1\u00a0\2\76\1\u00a0\1\151\1\u00a0\1\u0097";
    static final String dfa_26s = "\76\uffff\1\2\1\1\1\4\1\3\101\uffff";
    static final String dfa_27s = "\u0083\uffff}>";
    static final String[] dfa_28s = {
            "\1\1\1\2\10\uffff\1\61\1\uffff\1\37\2\uffff\1\41\1\40\1\uffff\1\67\1\42\2\uffff\1\44\1\74\1\51\1\46\1\52\1\62\4\uffff\1\70\3\uffff\1\55\1\56\1\43\1\53\1\54\1\47\1\uffff\1\45\1\57\1\63\1\uffff\1\33\1\64\2\uffff\1\50\1\60\1\65\1\uffff\1\73\1\66\1\72\1\71\1\75\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\24\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\3\1\6\1\15\1\20",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\102\1\103\10\uffff\1\162\1\uffff\1\140\2\uffff\1\142\1\141\1\uffff\1\170\1\143\2\uffff\1\145\1\175\1\152\1\147\1\153\1\163\2\uffff\1\76\1\uffff\1\171\3\uffff\1\156\1\157\1\144\1\154\1\155\1\150\1\uffff\1\146\1\160\1\164\1\uffff\1\134\1\165\2\uffff\1\151\1\161\1\166\1\uffff\1\174\1\167\1\173\1\172\1\176\1\132\1\112\1\105\1\113\1\uffff\1\117\1\uffff\1\124\1\uffff\1\127\2\uffff\1\135\1\uffff\1\136\1\uffff\1\137\1\uffff\1\120\1\114\1\125\1\111\1\131\1\uffff\1\115\1\122\1\123\1\133\1\106\1\126\1\uffff\1\110\1\uffff\1\130\1\uffff\1\104\1\107\1\116\1\121",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\77\16\uffff\1\76\5\uffff\1\101\22\uffff\1\100",
            "",
            "",
            "",
            "",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\2\77\10\uffff\1\77\1\uffff\1\77\2\uffff\2\77\1\uffff\2\77\2\uffff\6\77\2\uffff\1\76\1\uffff\1\77\3\uffff\1\u0080\5\77\1\uffff\3\77\1\uffff\2\77\2\uffff\3\77\1\uffff\1\177\10\77\1\uffff\1\77\1\uffff\1\77\1\uffff\1\77\2\uffff\1\77\1\uffff\1\77\1\uffff\1\77\1\uffff\5\77\1\uffff\6\77\1\uffff\1\77\1\uffff\1\77\1\uffff\4\77",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\2\101\10\uffff\1\101\1\uffff\1\101\2\uffff\2\101\1\uffff\2\101\2\uffff\6\101\2\uffff\1\76\1\uffff\1\101\3\uffff\6\101\1\uffff\3\101\1\uffff\2\101\2\uffff\3\101\1\uffff\1\u0081\10\101\1\uffff\1\101\1\uffff\1\101\1\uffff\1\101\2\uffff\1\101\1\uffff\1\101\1\uffff\1\101\1\uffff\5\101\1\uffff\6\101\1\uffff\1\101\1\uffff\1\101\1\uffff\4\101",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\100\1\uffff\3\100\10\uffff\1\100\1\uffff\1\100\2\uffff\2\100\1\uffff\2\100\2\uffff\6\100\2\uffff\1\76\1\uffff\1\100\2\uffff\1\100\1\u0082\5\100\1\uffff\3\100\1\uffff\3\100\1\uffff\3\100\1\uffff\11\100\1\uffff\1\100\1\uffff\1\100\1\uffff\1\100\2\uffff\1\100\1\uffff\1\100\1\uffff\1\100\1\uffff\5\100\1\uffff\6\100\1\uffff\1\100\1\uffff\1\100\1\uffff\7\100\22\uffff\17\100\1\uffff\1\100\1\uffff\4\100\5\uffff\1\100\4\uffff\2\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\76\5\uffff\1\101\22\uffff\1\100",
            "\1\100\1\uffff\3\100\10\uffff\1\100\1\uffff\1\100\1\uffff\1\77\2\100\1\uffff\2\100\2\uffff\6\100\4\uffff\1\100\2\uffff\7\100\1\uffff\3\100\1\uffff\3\100\1\uffff\3\100\1\uffff\11\100\1\uffff\1\100\1\uffff\1\100\1\uffff\1\100\2\uffff\1\100\1\uffff\1\100\1\uffff\1\100\1\uffff\5\100\1\uffff\6\100\1\uffff\1\100\1\uffff\1\100\1\uffff\7\100\22\uffff\17\100\1\uffff\1\100\1\uffff\4\100\5\uffff\1\100\4\uffff\2\100",
            "\2\101\10\uffff\1\101\1\uffff\1\101\1\uffff\1\77\2\101\1\uffff\2\101\2\uffff\6\101\4\uffff\1\101\3\uffff\6\101\1\uffff\3\101\1\uffff\2\101\2\uffff\3\101\1\uffff\11\101\1\uffff\1\101\1\uffff\1\101\1\uffff\1\101\2\uffff\1\101\1\uffff\1\101\1\uffff\1\101\1\uffff\5\101\1\uffff\6\101\1\uffff\1\101\1\uffff\1\101\1\uffff\4\101",
            "\1\100\1\uffff\3\100\10\uffff\1\100\1\uffff\1\100\1\uffff\1\101\2\100\1\uffff\2\100\2\uffff\6\100\4\uffff\1\100\2\uffff\7\100\1\uffff\3\100\1\uffff\3\100\1\uffff\3\100\1\uffff\11\100\1\uffff\1\100\1\uffff\1\100\1\uffff\1\100\2\uffff\1\100\1\uffff\1\100\1\uffff\1\100\1\uffff\5\100\1\uffff\6\100\1\uffff\1\100\1\uffff\1\100\1\uffff\7\100\22\uffff\17\100\1\uffff\1\100\1\uffff\4\100\5\uffff\1\100\4\uffff\2\100",
            "\2\101\10\uffff\1\101\1\uffff\1\101\1\uffff\1\100\2\101\1\uffff\2\101\2\uffff\6\101\1\100\3\uffff\1\101\1\uffff\2\100\6\101\1\uffff\3\101\1\100\2\101\1\100\1\uffff\3\101\1\100\11\101\1\uffff\1\101\1\uffff\1\101\1\uffff\1\101\2\uffff\1\101\1\uffff\1\101\1\uffff\1\101\1\uffff\5\101\1\uffff\6\101\1\uffff\1\101\1\uffff\1\101\1\uffff\4\101\1\100\2\uffff\22\100\26\uffff\1\100\1\uffff\1\100"
    };

    static final short[] dfa_23 = DFA.unpackEncodedString(dfa_23s);
    static final char[] dfa_24 = DFA.unpackEncodedStringToUnsignedChars(dfa_24s);
    static final char[] dfa_25 = DFA.unpackEncodedStringToUnsignedChars(dfa_25s);
    static final short[] dfa_26 = DFA.unpackEncodedString(dfa_26s);
    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final short[][] dfa_28 = unpackEncodedStringArray(dfa_28s);

    class DFA50 extends DFA {

        public DFA50(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 50;
            this.eot = dfa_23;
            this.eof = dfa_23;
            this.min = dfa_24;
            this.max = dfa_25;
            this.accept = dfa_26;
            this.special = dfa_27;
            this.transition = dfa_28;
        }
        public String getDescription() {
            return "2204:1: (this_AppendParameterBindingCS_0= ruleAppendParameterBindingCS | this_GuardParameterBindingCS_1= ruleGuardParameterBindingCS | this_LoopParameterBindingCS_2= ruleLoopParameterBindingCS | this_SimpleParameterBindingCS_3= ruleSimpleParameterBindingCS )";
        }
    }
    static final String dfa_29s = "\100\uffff";
    static final String dfa_30s = "\1\7\75\25\2\uffff";
    static final String dfa_31s = "\1\151\75\65\2\uffff";
    static final String dfa_32s = "\76\uffff\1\2\1\1";
    static final String dfa_33s = "\100\uffff}>";
    static final String[] dfa_34s = {
            "\1\1\1\2\10\uffff\1\61\1\uffff\1\37\2\uffff\1\41\1\40\1\uffff\1\67\1\42\2\uffff\1\44\1\74\1\51\1\46\1\52\1\62\4\uffff\1\70\3\uffff\1\55\1\56\1\43\1\53\1\54\1\47\1\uffff\1\45\1\57\1\63\1\uffff\1\33\1\64\2\uffff\1\50\1\60\1\65\1\uffff\1\73\1\66\1\72\1\71\1\75\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\24\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\3\1\6\1\15\1\20",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\77\13\uffff\1\76",
            "",
            ""
    };

    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
    static final char[] dfa_31 = DFA.unpackEncodedStringToUnsignedChars(dfa_31s);
    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);

    class DFA56 extends DFA {

        public DFA56(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 56;
            this.eot = dfa_29;
            this.eof = dfa_29;
            this.min = dfa_30;
            this.max = dfa_31;
            this.accept = dfa_32;
            this.special = dfa_33;
            this.transition = dfa_34;
        }
        public String getDescription() {
            return "2572:1: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?";
        }
    }
    static final String dfa_35s = "\117\uffff";
    static final String dfa_36s = "\1\76\116\uffff";
    static final String dfa_37s = "\1\7\75\25\1\uffff\17\30\1\uffff";
    static final String dfa_38s = "\1\u008d\75\65\1\uffff\17\51\1\uffff";
    static final String dfa_39s = "\76\uffff\1\2\17\uffff\1\1";
    static final String dfa_40s = "\117\uffff}>";
    static final String[] dfa_41s = {
            "\1\1\1\2\10\uffff\1\61\1\uffff\1\37\2\uffff\1\41\1\40\1\uffff\1\67\1\42\2\uffff\1\44\1\74\1\51\1\46\1\52\1\62\4\uffff\1\70\3\uffff\1\55\1\56\1\43\1\53\1\54\1\47\1\uffff\1\45\1\57\1\63\1\uffff\1\33\1\64\2\uffff\1\50\1\60\1\65\1\uffff\1\73\1\66\1\72\1\71\1\75\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\24\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\3\1\6\1\15\1\20\25\uffff\1\114\1\115\1\104\1\105\1\106\1\107\1\110\1\111\1\112\1\113\1\77\1\100\1\101\1\102\1\103",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "\1\76\2\uffff\1\76\12\uffff\1\76\5\uffff\1\116\13\uffff\1\76",
            "",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            "\1\76\12\uffff\1\76\5\uffff\1\116",
            ""
    };

    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
    static final char[] dfa_37 = DFA.unpackEncodedStringToUnsignedChars(dfa_37s);
    static final char[] dfa_38 = DFA.unpackEncodedStringToUnsignedChars(dfa_38s);
    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final short[][] dfa_41 = unpackEncodedStringArray(dfa_41s);

    class DFA66 extends DFA {

        public DFA66(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 66;
            this.eot = dfa_35;
            this.eof = dfa_36;
            this.min = dfa_37;
            this.max = dfa_38;
            this.accept = dfa_39;
            this.special = dfa_40;
            this.transition = dfa_41;
        }
        public String getDescription() {
            return "()* loopback of 2947:1: ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*";
        }
    }
    static final String dfa_42s = "\77\uffff";
    static final String dfa_43s = "\1\7\1\0\75\uffff";
    static final String dfa_44s = "\1\151\1\0\75\uffff";
    static final String dfa_45s = "\2\uffff\1\2\73\uffff\1\1";
    static final String dfa_46s = "\1\uffff\1\0\75\uffff}>";
    static final String[] dfa_47s = {
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\1\1\5\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\uffff\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_42 = DFA.unpackEncodedString(dfa_42s);
    static final char[] dfa_43 = DFA.unpackEncodedStringToUnsignedChars(dfa_43s);
    static final char[] dfa_44 = DFA.unpackEncodedStringToUnsignedChars(dfa_44s);
    static final short[] dfa_45 = DFA.unpackEncodedString(dfa_45s);
    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
    static final short[][] dfa_47 = unpackEncodedStringArray(dfa_47s);

    class DFA71 extends DFA {

        public DFA71(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 71;
            this.eot = dfa_42;
            this.eof = dfa_42;
            this.min = dfa_43;
            this.max = dfa_44;
            this.accept = dfa_45;
            this.special = dfa_46;
            this.transition = dfa_47;
        }
        public String getDescription() {
            return "3156:2: ( (lv_isCheck_0_0= 'check' ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA71_1 = input.LA(1);


                        int index71_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred82_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index71_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 71, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_48s = "\1\7\75\30\2\uffff";
    static final String dfa_49s = "\1\u008d\75\51\2\uffff";
    static final String[] dfa_50s = {
            "\1\1\1\2\10\uffff\1\61\1\uffff\1\37\2\uffff\1\41\1\40\1\uffff\1\67\1\42\2\uffff\1\44\1\74\1\51\1\46\1\52\1\62\4\uffff\1\70\3\uffff\1\55\1\56\1\43\1\53\1\54\1\47\1\uffff\1\45\1\57\1\63\1\uffff\1\33\1\64\2\uffff\1\50\1\60\1\65\1\uffff\1\73\1\66\1\72\1\71\1\75\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\24\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\3\1\6\1\15\1\20\25\uffff\17\76",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "\1\76\12\uffff\1\76\5\uffff\1\77",
            "",
            ""
    };
    static final char[] dfa_48 = DFA.unpackEncodedStringToUnsignedChars(dfa_48s);
    static final char[] dfa_49 = DFA.unpackEncodedStringToUnsignedChars(dfa_49s);
    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);

    class DFA73 extends DFA {

        public DFA73(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 73;
            this.eot = dfa_29;
            this.eof = dfa_29;
            this.min = dfa_48;
            this.max = dfa_49;
            this.accept = dfa_32;
            this.special = dfa_33;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "3400:1: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?";
        }
    }
    static final String dfa_51s = "\2\uffff\75\1\1\uffff";
    static final String dfa_52s = "\1\4\1\uffff\75\22\1\uffff";
    static final String dfa_53s = "\1\u00a0\1\uffff\75\u0097\1\uffff";
    static final String dfa_54s = "\1\uffff\1\1\75\uffff\1\2";
    static final String[] dfa_55s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\62\1\uffff\1\40\2\uffff\1\42\1\41\1\77\1\70\1\43\2\uffff\1\45\1\75\1\52\1\47\1\53\1\63\4\uffff\1\71\2\uffff\1\1\1\56\1\57\1\44\1\54\1\55\1\50\1\uffff\1\46\1\60\1\64\1\uffff\1\34\1\65\1\1\1\uffff\1\51\1\61\1\66\1\uffff\1\74\1\67\1\73\1\72\1\76\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\25\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\4\1\7\1\16\1\21\3\1\22\uffff\17\1\1\uffff\1\1\1\uffff\4\1\5\uffff\1\1\4\uffff\2\1",
            "",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\2\uffff\1\1\7\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[] dfa_51 = DFA.unpackEncodedString(dfa_51s);
    static final char[] dfa_52 = DFA.unpackEncodedStringToUnsignedChars(dfa_52s);
    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
    static final short[] dfa_54 = DFA.unpackEncodedString(dfa_54s);
    static final short[][] dfa_55 = unpackEncodedStringArray(dfa_55s);

    class DFA190 extends DFA {

        public DFA190(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 190;
            this.eot = dfa_29;
            this.eof = dfa_51;
            this.min = dfa_52;
            this.max = dfa_53;
            this.accept = dfa_54;
            this.special = dfa_33;
            this.transition = dfa_55;
        }
        public String getDescription() {
            return "8042:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )";
        }
    }
    static final String[] dfa_56s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\62\1\uffff\1\40\2\uffff\1\42\1\41\1\77\1\70\1\43\2\uffff\1\45\1\75\1\52\1\47\1\53\1\63\4\uffff\1\71\2\uffff\1\1\1\56\1\57\1\44\1\54\1\55\1\50\1\uffff\1\46\1\60\1\64\1\uffff\1\34\1\65\1\1\1\uffff\1\51\1\61\1\66\1\uffff\1\74\1\67\1\73\1\72\1\76\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\25\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\4\1\7\1\16\1\21\3\1\22\uffff\17\1\1\uffff\1\1\1\uffff\4\1\5\uffff\1\1\4\uffff\2\1",
            "",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            "\1\1\5\uffff\1\77\12\uffff\2\1\4\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[][] dfa_56 = unpackEncodedStringArray(dfa_56s);

    class DFA193 extends DFA {

        public DFA193(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 193;
            this.eot = dfa_29;
            this.eof = dfa_51;
            this.min = dfa_52;
            this.max = dfa_53;
            this.accept = dfa_54;
            this.special = dfa_33;
            this.transition = dfa_56;
        }
        public String getDescription() {
            return "8255:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )";
        }
    }
    static final String dfa_57s = "\22\uffff";
    static final String dfa_58s = "\1\2\21\uffff";
    static final String dfa_59s = "\1\22\1\0\20\uffff";
    static final String dfa_60s = "\1\u009b\1\0\20\uffff";
    static final String dfa_61s = "\2\uffff\1\2\16\uffff\1\1";
    static final String dfa_62s = "\1\uffff\1\0\20\uffff}>";
    static final String[] dfa_63s = {
            "\1\2\2\uffff\1\2\6\uffff\1\2\6\uffff\1\1\1\2\2\uffff\1\2\11\uffff\1\2\3\uffff\1\2\3\uffff\2\2\123\uffff\1\2\1\uffff\1\2\6\uffff\1\2\1\uffff\1\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_57 = DFA.unpackEncodedString(dfa_57s);
    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 DFA206 extends DFA {

        public DFA206(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 206;
            this.eot = dfa_57;
            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 "9255:2: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA206_1 = input.LA(1);


                        int index206_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred358_InternalQVTimperative()) ) {s = 17;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index206_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 206, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA205 extends DFA {

        public DFA205(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 205;
            this.eot = dfa_57;
            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 "9273:2: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA205_1 = input.LA(1);


                        int index205_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred357_InternalQVTimperative()) ) {s = 17;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index205_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 205, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_64s = "\116\uffff";
    static final String dfa_65s = "\1\7\105\uffff\5\0\3\uffff";
    static final String dfa_66s = "\1\u008d\105\uffff\5\0\3\uffff";
    static final String dfa_67s = "\1\uffff\1\1\74\uffff\1\2\16\uffff\1\3";
    static final String dfa_68s = "\106\uffff\1\0\1\1\1\2\1\3\1\4\3\uffff}>";
    static final String[] dfa_69s = {
            "\2\1\10\uffff\1\1\1\uffff\1\1\2\uffff\2\1\1\uffff\2\1\2\uffff\6\1\4\uffff\1\1\3\uffff\6\1\1\uffff\3\1\1\uffff\2\1\2\uffff\3\1\1\uffff\11\1\1\uffff\1\1\1\uffff\1\1\1\uffff\1\1\2\uffff\1\1\1\uffff\1\1\1\uffff\1\1\1\uffff\5\1\1\uffff\6\1\1\uffff\1\1\1\uffff\1\1\1\uffff\4\1\25\uffff\12\76\1\106\1\107\1\110\1\111\1\112",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            ""
    };

    static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
    static final char[] dfa_65 = DFA.unpackEncodedStringToUnsignedChars(dfa_65s);
    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
    static final short[] dfa_67 = DFA.unpackEncodedString(dfa_67s);
    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
    static final short[][] dfa_69 = unpackEncodedStringArray(dfa_69s);

    class DFA207 extends DFA {

        public DFA207(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 207;
            this.eot = dfa_64;
            this.eof = dfa_64;
            this.min = dfa_65;
            this.max = dfa_66;
            this.accept = dfa_67;
            this.special = dfa_68;
            this.transition = dfa_69;
        }
        public String getDescription() {
            return "9320:1: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA207_70 = input.LA(1);


                        int index207_70 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 77;}


                        input.seek(index207_70);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA207_71 = input.LA(1);


                        int index207_71 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 77;}


                        input.seek(index207_71);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA207_72 = input.LA(1);


                        int index207_72 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 77;}


                        input.seek(index207_72);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA207_73 = input.LA(1);


                        int index207_73 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 77;}


                        input.seek(index207_73);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA207_74 = input.LA(1);


                        int index207_74 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTimperative()) ) {s = 62;}

                        else if ( (true) ) {s = 77;}


                        input.seek(index207_74);
                        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_70s = "\134\uffff";
    static final String dfa_71s = "\1\4\3\0\130\uffff";
    static final String dfa_72s = "\1\u00a0\3\0\130\uffff";
    static final String dfa_73s = "\4\uffff\1\1\126\uffff\1\2";
    static final String dfa_74s = "\1\uffff\1\0\1\1\1\2\130\uffff}>";
    static final String[] dfa_75s = {
            "\1\4\1\uffff\3\4\10\uffff\1\4\1\uffff\1\4\2\uffff\2\4\1\uffff\2\4\2\uffff\6\4\4\uffff\1\4\2\uffff\7\4\1\uffff\3\4\1\uffff\3\4\1\uffff\3\4\1\uffff\11\4\1\uffff\1\4\1\uffff\1\4\1\uffff\1\4\2\uffff\1\4\1\uffff\1\4\1\uffff\1\4\1\uffff\5\4\1\uffff\6\4\1\uffff\1\4\1\uffff\1\4\1\uffff\4\4\1\1\1\2\1\3\22\uffff\17\4\1\uffff\1\4\1\uffff\4\4\5\uffff\1\4\4\uffff\1\133\1\4",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_70 = DFA.unpackEncodedString(dfa_70s);
    static final char[] dfa_71 = DFA.unpackEncodedStringToUnsignedChars(dfa_71s);
    static final char[] dfa_72 = DFA.unpackEncodedStringToUnsignedChars(dfa_72s);
    static final short[] dfa_73 = DFA.unpackEncodedString(dfa_73s);
    static final short[] dfa_74 = DFA.unpackEncodedString(dfa_74s);
    static final short[][] dfa_75 = unpackEncodedStringArray(dfa_75s);

    class DFA210 extends DFA {

        public DFA210(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 210;
            this.eot = dfa_70;
            this.eof = dfa_70;
            this.min = dfa_71;
            this.max = dfa_72;
            this.accept = dfa_73;
            this.special = dfa_74;
            this.transition = dfa_75;
        }
        public String getDescription() {
            return "9430:1: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA210_1 = input.LA(1);


                        int index210_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred363_InternalQVTimperative()) ) {s = 4;}

                        else if ( (true) ) {s = 91;}


                        input.seek(index210_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA210_2 = input.LA(1);


                        int index210_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred363_InternalQVTimperative()) ) {s = 4;}

                        else if ( (true) ) {s = 91;}


                        input.seek(index210_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA210_3 = input.LA(1);


                        int index210_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred363_InternalQVTimperative()) ) {s = 4;}

                        else if ( (true) ) {s = 91;}


                        input.seek(index210_3);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 210, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_76s = "\133\uffff";
    static final String dfa_77s = "\1\4\12\uffff\7\0\111\uffff";
    static final String dfa_78s = "\1\u00a0\12\uffff\7\0\111\uffff";
    static final String dfa_79s = "\1\uffff\1\1\1\2\1\3\1\4\15\uffff\1\10\1\11\7\uffff\1\12\74\uffff\1\5\1\6\1\7";
    static final String dfa_80s = "\13\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\111\uffff}>";
    static final String[] dfa_81s = {
            "\1\4\1\uffff\1\4\2\33\10\uffff\1\33\1\uffff\1\33\2\uffff\2\33\1\uffff\2\33\2\uffff\6\33\4\uffff\1\33\2\uffff\1\4\6\33\1\uffff\3\33\1\uffff\2\33\1\1\1\uffff\3\33\1\uffff\11\33\1\uffff\1\33\1\uffff\1\33\1\uffff\1\33\2\uffff\1\33\1\uffff\1\33\1\uffff\1\33\1\uffff\5\33\1\uffff\6\33\1\uffff\1\33\1\uffff\1\33\1\uffff\4\33\25\uffff\1\14\1\13\10\23\1\15\1\16\1\17\1\20\1\21\1\uffff\1\22\1\uffff\4\4\5\uffff\1\2\5\uffff\1\3",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
    static final char[] dfa_77 = DFA.unpackEncodedStringToUnsignedChars(dfa_77s);
    static final char[] dfa_78 = DFA.unpackEncodedStringToUnsignedChars(dfa_78s);
    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
    static final short[] dfa_80 = DFA.unpackEncodedString(dfa_80s);
    static final short[][] dfa_81 = unpackEncodedStringArray(dfa_81s);

    class DFA213 extends DFA {

        public DFA213(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 213;
            this.eot = dfa_76;
            this.eof = dfa_76;
            this.min = dfa_77;
            this.max = dfa_78;
            this.accept = dfa_79;
            this.special = dfa_80;
            this.transition = dfa_81;
        }
        public String getDescription() {
            return "9679:1: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA213_11 = input.LA(1);


                        int index213_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred370_InternalQVTimperative()) ) {s = 88;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_11);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA213_12 = input.LA(1);


                        int index213_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred371_InternalQVTimperative()) ) {s = 89;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_12);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA213_13 = input.LA(1);


                        int index213_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred372_InternalQVTimperative()) ) {s = 90;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_13);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA213_14 = input.LA(1);


                        int index213_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred372_InternalQVTimperative()) ) {s = 90;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_14);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA213_15 = input.LA(1);


                        int index213_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred372_InternalQVTimperative()) ) {s = 90;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_15);
                        if ( s>=0 ) return s;
                        break;
                    case 5 :
                        int LA213_16 = input.LA(1);


                        int index213_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred372_InternalQVTimperative()) ) {s = 90;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_16);
                        if ( s>=0 ) return s;
                        break;
                    case 6 :
                        int LA213_17 = input.LA(1);


                        int index213_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred372_InternalQVTimperative()) ) {s = 90;}

                        else if ( (synpred374_InternalQVTimperative()) ) {s = 19;}


                        input.seek(index213_17);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 213, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_82s = "\1\2\11\uffff";
    static final String dfa_83s = "\1\22\1\4\2\uffff\6\7";
    static final String dfa_84s = "\1\u009e\1\151\2\uffff\6\151";
    static final String dfa_85s = "\2\uffff\1\2\1\1\6\uffff";
    static final String dfa_86s = "\12\uffff}>";
    static final String[] dfa_87s = {
            "\1\2\2\uffff\1\2\2\uffff\1\2\2\uffff\1\2\7\uffff\1\1\1\2\5\uffff\1\2\6\uffff\1\2\3\uffff\1\2\3\uffff\1\2\3\uffff\1\2\54\uffff\1\2\2\uffff\22\2\21\uffff\1\2\4\uffff\1\2\2\uffff\2\2\1\uffff\4\2",
            "\1\3\2\uffff\2\3\10\uffff\1\11\1\uffff\1\4\2\uffff\2\3\1\uffff\2\3\2\uffff\6\3\1\uffff\1\3\2\uffff\1\3\3\uffff\2\3\1\5\1\7\1\10\1\6\1\uffff\3\3\1\uffff\2\3\2\uffff\3\3\1\uffff\11\3\1\uffff\1\3\1\uffff\1\3\1\uffff\1\3\2\uffff\1\3\1\uffff\1\3\1\uffff\1\3\1\uffff\5\3\1\uffff\6\3\1\uffff\1\3\1\uffff\1\3\1\uffff\4\3",
            "",
            "",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\2\2\10\uffff\1\2\1\uffff\1\2\2\uffff\2\2\1\uffff\2\2\2\uffff\6\2\4\uffff\1\2\3\uffff\6\2\1\uffff\3\2\1\3\2\2\2\uffff\3\2\1\uffff\11\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\uffff\5\2\1\uffff\6\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2"
    };
    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
    static final char[] dfa_83 = DFA.unpackEncodedStringToUnsignedChars(dfa_83s);
    static final char[] dfa_84 = DFA.unpackEncodedStringToUnsignedChars(dfa_84s);
    static final short[] dfa_85 = DFA.unpackEncodedString(dfa_85s);
    static final short[] dfa_86 = DFA.unpackEncodedString(dfa_86s);
    static final short[][] dfa_87 = unpackEncodedStringArray(dfa_87s);

    class DFA216 extends DFA {

        public DFA216(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 216;
            this.eot = dfa_17;
            this.eof = dfa_82;
            this.min = dfa_83;
            this.max = dfa_84;
            this.accept = dfa_85;
            this.special = dfa_86;
            this.transition = dfa_87;
        }
        public String getDescription() {
            return "9883:3: ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )?";
        }
    }
    static final String dfa_88s = "\13\uffff";
    static final String dfa_89s = "\1\4\12\uffff";
    static final String dfa_90s = "\1\22\2\0\10\uffff";
    static final String dfa_91s = "\1\u0099\2\0\10\uffff";
    static final String dfa_92s = "\3\uffff\1\3\1\4\4\uffff\1\1\1\2";
    static final String dfa_93s = "\1\uffff\1\0\1\1\10\uffff}>";
    static final String[] dfa_94s = {
            "\1\4\2\uffff\1\4\2\uffff\1\2\30\uffff\1\3\7\uffff\1\4\126\uffff\1\1\10\uffff\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_88 = DFA.unpackEncodedString(dfa_88s);
    static final short[] dfa_89 = DFA.unpackEncodedString(dfa_89s);
    static final char[] dfa_90 = DFA.unpackEncodedStringToUnsignedChars(dfa_90s);
    static final char[] dfa_91 = DFA.unpackEncodedStringToUnsignedChars(dfa_91s);
    static final short[] dfa_92 = DFA.unpackEncodedString(dfa_92s);
    static final short[] dfa_93 = DFA.unpackEncodedString(dfa_93s);
    static final short[][] dfa_94 = unpackEncodedStringArray(dfa_94s);

    class DFA229 extends DFA {

        public DFA229(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 229;
            this.eot = dfa_88;
            this.eof = dfa_89;
            this.min = dfa_90;
            this.max = dfa_91;
            this.accept = dfa_92;
            this.special = dfa_93;
            this.transition = dfa_94;
        }
        public String getDescription() {
            return "10213:2: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA229_1 = input.LA(1);


                        int index229_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred387_InternalQVTimperative()) ) {s = 9;}

                        else if ( (synpred393_InternalQVTimperative()) ) {s = 3;}


                        input.seek(index229_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA229_2 = input.LA(1);


                        int index229_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred390_InternalQVTimperative()) ) {s = 10;}

                        else if ( (synpred393_InternalQVTimperative()) ) {s = 3;}


                        input.seek(index229_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 229, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA238 extends DFA {

        public DFA238(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 238;
            this.eot = dfa_88;
            this.eof = dfa_89;
            this.min = dfa_90;
            this.max = dfa_91;
            this.accept = dfa_92;
            this.special = dfa_93;
            this.transition = dfa_94;
        }
        public String getDescription() {
            return "10566:2: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA238_1 = input.LA(1);


                        int index238_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred398_InternalQVTimperative()) ) {s = 9;}

                        else if ( (synpred404_InternalQVTimperative()) ) {s = 3;}


                        input.seek(index238_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA238_2 = input.LA(1);


                        int index238_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred401_InternalQVTimperative()) ) {s = 10;}

                        else if ( (synpred404_InternalQVTimperative()) ) {s = 3;}


                        input.seek(index238_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 238, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_95s = "\1\4\1\uffff\75\30\1\uffff";
    static final String dfa_96s = "\1\u00a0\1\uffff\75\u009b\1\uffff";
    static final String[] dfa_97s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\62\1\uffff\1\40\2\uffff\1\42\1\41\1\77\1\70\1\43\2\uffff\1\45\1\75\1\52\1\47\1\53\1\63\4\uffff\1\71\2\uffff\1\1\1\56\1\57\1\44\1\54\1\55\1\50\1\uffff\1\46\1\60\1\64\1\uffff\1\34\1\65\1\1\1\uffff\1\51\1\61\1\66\1\uffff\1\74\1\67\1\73\1\72\1\76\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\25\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\4\1\7\1\16\1\21\3\1\22\uffff\17\1\1\uffff\1\1\1\uffff\4\1\5\uffff\1\1\4\uffff\2\1",
            "",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            "\1\77\12\uffff\1\1\5\uffff\2\1\12\uffff\1\1\2\uffff\1\1\4\uffff\1\1\54\uffff\1\1\2\uffff\22\1\26\uffff\1\1\1\uffff\1\1\3\uffff\1\1",
            ""
    };
    static final char[] dfa_95 = DFA.unpackEncodedStringToUnsignedChars(dfa_95s);
    static final char[] dfa_96 = DFA.unpackEncodedStringToUnsignedChars(dfa_96s);
    static final short[][] dfa_97 = unpackEncodedStringArray(dfa_97s);

    class DFA242 extends DFA {

        public DFA242(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 242;
            this.eot = dfa_29;
            this.eof = dfa_29;
            this.min = dfa_95;
            this.max = dfa_96;
            this.accept = dfa_54;
            this.special = dfa_33;
            this.transition = dfa_97;
        }
        public String getDescription() {
            return "10963:1: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )";
        }
    }



    private static class FollowSets000 {
        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[]{0x0010010000000002L,0x0000000000000001L});
        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0010000000000002L,0x0000000000000001L});
        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0xDCDDF887E6CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x00000000000C0000L});
        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000100000L});
        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0xDDDDFC87E6CA01D0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000200000L});
        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000400000L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000001000000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0xDCDDF887E6CA0180L,0x800003D5FBEA957FL,0x0000000000003FFFL});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000004000000L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0xDCDDF887E7CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000000040L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0xDCDDF887EECA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000011200000L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000010200000L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000020040000L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000060040000L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000040000000L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000011000000L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000010000000L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000080000002L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000040002L});
        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000100000000L});
        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000E00000000L});
        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000C00040000L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000800040000L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x980FE050668A0000L});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x980DE010660A0000L});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x180DE010000A0000L});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0001E010000A0000L});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000002000000000L});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000008000200000L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0xDCDDF887E6CA0190L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000020000200000L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000040000000000L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000080000000000L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000100000000000L});
        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000800000000L});
        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0xDCDDF897E6CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0001000000040000L});
        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0002000000000000L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0001E000000A0000L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000001000002L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x000C000000040000L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0008000000000000L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0020000801200000L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0020000800200000L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000800200000L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0010001000000000L,0x000000C009800001L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0080000000000000L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0100000000000000L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0xDEDDF887E6CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0200000000040000L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0400000800200000L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000001000000000L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000010L});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000020000000000L});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0xDCDDF887E6CA0182L,0x800003D5FBEA957FL,0x0000000000003FFFL});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x1800000000040000L});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x1000000000000000L});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x2000000000000000L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000010100000L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x4000000000000000L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000240000L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000801000000L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x00C0101182200180L});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x00C0101102000000L});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000030L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000028L});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0040000000000000L,0x00000000001FFFC0L});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0040001000040000L,0x00000000001FFFC0L});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0040001000000000L,0x00000000001FFFC0L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000001000000000L,0x0000000000600000L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0xDDDDFC87E6EA01F0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000001600000000L,0x0000000000000004L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000200002L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000000L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0100000801200000L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000801200000L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000001000000000L,0x0000000006000000L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000001000000180L,0x0000000010000000L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000040L,0x0000040000000000L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000010L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000008L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0xDDDDF887E6CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000801200000L,0x0000000040000000L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000800200000L,0x0000000040000000L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000800240000L});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000000L,0x0000000000018CC0L});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000001000040000L,0x0000000000018CC0L});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000001000000000L,0x0000000000018CC0L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000001000000000L,0x0000000080000000L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000801000002L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000800000002L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0000000000018C00L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000001000040000L,0x0000000000018C00L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000001000000000L,0x0000000000018C00L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000010L});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000008L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0020000801200000L,0x0000000200000000L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0040000000000000L,0x0000003C001FFCC0L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0040001000040000L,0x0000003C001FFCC0L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0040001000000000L,0x0000003C001FFCC0L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000080000200000L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0xDCDDF88FE6CA0180L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000001000040000L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0100000801200000L,0x0000010000000000L});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000801200000L,0x0000010000000000L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000801240000L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000001000000000L,0x0000020000000000L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000001000000000L,0x0000000120000038L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000800000L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000020000000002L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0100000000000002L});
        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0200000000000000L,0x0000000000000000L,0x0000000000800000L});
        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0200000000000000L});
        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000040000L});
        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0xDDDDFC97E7CA01D0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0xDDDDFC87E7CA01D0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000008000002L});
        public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000040000L,0x0000000000000000L,0x0000000000004000L});
        public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000180L});
        public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0020000000000000L});
        public static final BitSet FOLLOW_131 = new BitSet(new long[]{0xDDDDFC97E6CA01D0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010000L});
        public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0020000001000000L});
        public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000012L});
        public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x2020040000000002L,0x7FFFE40000000000L});
        public static final BitSet FOLLOW_136 = new BitSet(new long[]{0xDDDDFC87E6CA01D0L,0x80001FD5FBEA957FL,0x00000001041EBFFFL});
        public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0100000800000002L,0x0000000000000000L,0x0000000000A00000L});
        public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000800000002L,0x0000000000000000L,0x0000000000200000L});
        public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000200000L});
        public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000400000L});
        public static final BitSet FOLLOW_141 = new BitSet(new long[]{0xDCDDF897E6CA0190L,0x000003D5FBEA957FL});
        public static final BitSet FOLLOW_142 = new BitSet(new long[]{0xDFDDFC87E7CA01D0L,0x80001FD5FBEA957FL,0x00000001841EBFFFL});
        public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0200000000240000L,0x0000000000000000L,0x0000000002000000L});
        public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000040000L,0x0000000000000000L,0x0000000001000000L});
        public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0002000001000002L,0x0000000000000000L,0x0000000000010000L});
        public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0020000000000002L});
        public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0020000000000002L,0x0000000000000000L,0x0000000000010000L});
        public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0002000000000000L,0x0000000000000000L,0x0000000000010000L});
        public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000008000000L});
        public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000050000000L});
        public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000020000000L});
        public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0002000000040000L});
        public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0120000001000000L});
        public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000040000000040L});
        public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000040000000040L,0x0000400000000000L,0x0000000800000000L});
        public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000601000000L});
        public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000001000000L});
        public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000040002L,0x0000000000000000L,0x0000000000800000L});
        public static final BitSet FOLLOW_159 = new BitSet(new long[]{0xDCDDF887E6CA0180L,0x800003D5FBEA957FL,0x0000000800003FFFL});
        public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
        public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000001000000000L});
    }


}
