package org.eclipse.ocl.xtext.oclinecore.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.ocl.xtext.oclinecore.services.OCLinEcoreGrammarAccess;



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, 2019 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 InternalOCLinEcoreParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_INT", "RULE_SINGLE_QUOTED_STRING", "RULE_ML_SINGLE_QUOTED_STRING", "RULE_UNQUOTED_STRING", "RULE_SIMPLE_ID", "RULE_ESCAPED_ID", "RULE_ESCAPED_CHARACTER", "RULE_LETTER_CHARACTER", "RULE_DOUBLE_QUOTED_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'module'", "'-'", "'abstract'", "'attribute'", "'body'", "'callable'", "'class'", "'composes'", "'datatype'", "'definition'", "'derivation'", "'derived'", "'enum'", "'extends'", "'id'", "'import'", "'initial'", "'interface'", "'key'", "'library'", "'operation'", "'ordered'", "'package'", "'postcondition'", "'precondition'", "'primitive'", "'property'", "'readonly'", "'reference'", "'resolve'", "'static'", "'throws'", "'transient'", "'unique'", "'unsettable'", "'volatile'", "'invariant'", "'('", "')'", "':'", "';'", "'annotation'", "','", "'{'", "'}'", "'='", "'!derived'", "'!id'", "'!ordered'", "'!readonly'", "'!transient'", "'!unique'", "'!unsettable'", "'!volatile'", "'serializable'", "'!serializable'", "'documentation'", "'literal'", "'::*'", "'opposite'", "'#'", "'!composes'", "'!resolve'", "'sysml'", "'<'", "'>'", "'not'", "'*'", "'/'", "'+'", "'>='", "'<='", "'<>'", "'and'", "'or'", "'xor'", "'implies'", "'.'", "'->'", "'?.'", "'?->'", "'Map'", "'Tuple'", "'::'", "'Boolean'", "'Integer'", "'Real'", "'String'", "'UnlimitedNatural'", "'OclAny'", "'OclInvalid'", "'OclVoid'", "'Set'", "'Bag'", "'Sequence'", "'Collection'", "'OrderedSet'", "'..'", "'++'", "'Lambda'", "'<-'", "'true'", "'false'", "'invalid'", "'null'", "'@'", "'pre'", "'['", "']'", "'in'", "'|'", "'if'", "'then'", "'else'", "'endif'", "'elseif'", "'let'", "'self'", "'|?'", "'|1'", "'?'", "'&&'"
    };
    public static final int T__50=50;
    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__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=4;
    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__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int RULE_SINGLE_QUOTED_STRING=5;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int RULE_DOUBLE_QUOTED_STRING=12;
    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=9;
    public static final int T__40=40;
    public static final int T__41=41;
    public static final int T__42=42;
    public static final int T__43=43;
    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=11;
    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=10;
    public static final int T__95=95;
    public static final int RULE_ML_SINGLE_QUOTED_STRING=6;
    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=7;
    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=8;
    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 InternalOCLinEcoreParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalOCLinEcoreParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);

        }


    public String[] getTokenNames() { return InternalOCLinEcoreParser.tokenNames; }
    public String getGrammarFileName() { return "InternalOCLinEcore.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 OCLinEcoreGrammarAccess grammarAccess;

        public InternalOCLinEcoreParser(TokenStream input, OCLinEcoreGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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



    // $ANTLR start "entryRuleTopLevelCS"
    // InternalOCLinEcore.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 {
            // InternalOCLinEcore.g:81:2: (iv_ruleTopLevelCS= ruleTopLevelCS EOF )
            // InternalOCLinEcore.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"
    // InternalOCLinEcore.g:89:1: ruleTopLevelCS returns [EObject current=null] : ( () (otherlv_1= 'module' ruleUnrestrictedName )? ( (lv_ownedImports_3_0= ruleImportCS ) )* ( (lv_ownedPackages_4_0= rulePackageCS ) )* ) ;
    public final EObject ruleTopLevelCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedImports_3_0 = null;

        EObject lv_ownedPackages_4_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:92:28: ( ( () (otherlv_1= 'module' ruleUnrestrictedName )? ( (lv_ownedImports_3_0= ruleImportCS ) )* ( (lv_ownedPackages_4_0= rulePackageCS ) )* ) )
            // InternalOCLinEcore.g:93:1: ( () (otherlv_1= 'module' ruleUnrestrictedName )? ( (lv_ownedImports_3_0= ruleImportCS ) )* ( (lv_ownedPackages_4_0= rulePackageCS ) )* )
            {
            // InternalOCLinEcore.g:93:1: ( () (otherlv_1= 'module' ruleUnrestrictedName )? ( (lv_ownedImports_3_0= ruleImportCS ) )* ( (lv_ownedPackages_4_0= rulePackageCS ) )* )
            // InternalOCLinEcore.g:93:2: () (otherlv_1= 'module' ruleUnrestrictedName )? ( (lv_ownedImports_3_0= ruleImportCS ) )* ( (lv_ownedPackages_4_0= rulePackageCS ) )*
            {
            // InternalOCLinEcore.g:93:2: ()
            // InternalOCLinEcore.g:94:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getTopLevelCSAccess().getTopLevelCSAction_0(),
                          current);

            }

            }

            // InternalOCLinEcore.g:102:2: (otherlv_1= 'module' ruleUnrestrictedName )?
            int alt1=2;
            int LA1_0 = input.LA(1);

            if ( (LA1_0==17) ) {
                alt1=1;
            }
            switch (alt1) {
                case 1 :
                    // InternalOCLinEcore.g:102:4: otherlv_1= 'module' ruleUnrestrictedName
                    {
                    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTopLevelCSAccess().getModuleKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getTopLevelCSAccess().getUnrestrictedNameParserRuleCall_1_1());

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

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

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:117:3: ( (lv_ownedImports_3_0= ruleImportCS ) )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==32||LA2_0==36) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // InternalOCLinEcore.g:118:1: (lv_ownedImports_3_0= ruleImportCS )
            	    {
            	    // InternalOCLinEcore.g:118:1: (lv_ownedImports_3_0= ruleImportCS )
            	    // InternalOCLinEcore.g:119:3: lv_ownedImports_3_0= ruleImportCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedImportsImportCSParserRuleCall_2_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_ownedImports_3_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_3_0,
            	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.ImportCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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

            // InternalOCLinEcore.g:135:3: ( (lv_ownedPackages_4_0= rulePackageCS ) )*
            loop3:
            do {
                int alt3=2;
                int LA3_0 = input.LA(1);

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


                switch (alt3) {
            	case 1 :
            	    // InternalOCLinEcore.g:136:1: (lv_ownedPackages_4_0= rulePackageCS )
            	    {
            	    // InternalOCLinEcore.g:136:1: (lv_ownedPackages_4_0= rulePackageCS )
            	    // InternalOCLinEcore.g:137:3: lv_ownedPackages_4_0= rulePackageCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedPackagesPackageCSParserRuleCall_3_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_5);
            	    lv_ownedPackages_4_0=rulePackageCS();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      	        }
            	             		add(
            	             			current,
            	             			"ownedPackages",
            	              		lv_ownedPackages_4_0,
            	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.PackageCS");
            	      	        afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

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


            }


            }

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

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


    // $ANTLR start "entryRuleSIGNED"
    // InternalOCLinEcore.g:163:1: entryRuleSIGNED returns [String current=null] : iv_ruleSIGNED= ruleSIGNED EOF ;
    public final String entryRuleSIGNED() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSIGNED = null;


        try {
            // InternalOCLinEcore.g:164:2: (iv_ruleSIGNED= ruleSIGNED EOF )
            // InternalOCLinEcore.g:165: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"
    // InternalOCLinEcore.g:172: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 {
            // InternalOCLinEcore.g:175:28: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
            // InternalOCLinEcore.g:176:1: ( (kw= '-' )? this_INT_1= RULE_INT )
            {
            // InternalOCLinEcore.g:176:1: ( (kw= '-' )? this_INT_1= RULE_INT )
            // InternalOCLinEcore.g:176:2: (kw= '-' )? this_INT_1= RULE_INT
            {
            // InternalOCLinEcore.g:176:2: (kw= '-' )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==18) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalOCLinEcore.g:177:2: kw= '-'
                    {
                    kw=(Token)match(input,18,FollowSets000.FOLLOW_6); 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 "entryRuleEnumerationLiteralName"
    // InternalOCLinEcore.g:197:1: entryRuleEnumerationLiteralName returns [String current=null] : iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF ;
    public final String entryRuleEnumerationLiteralName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEnumerationLiteralName = null;


        try {
            // InternalOCLinEcore.g:198:2: (iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF )
            // InternalOCLinEcore.g:199: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"
    // InternalOCLinEcore.g:206:1: ruleEnumerationLiteralName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'callable' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derivation' | kw= 'derived' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'import' | kw= 'initial' | kw= 'interface' | kw= 'key' | kw= 'library' | kw= 'module' | kw= 'operation' | kw= 'ordered' | kw= 'package' | kw= 'postcondition' | kw= 'precondition' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'reference' | kw= 'resolve' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) ;
    public final AntlrDatatypeRuleToken ruleEnumerationLiteralName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_EssentialOCLUnrestrictedName_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:209:28: ( (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'callable' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derivation' | kw= 'derived' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'import' | kw= 'initial' | kw= 'interface' | kw= 'key' | kw= 'library' | kw= 'module' | kw= 'operation' | kw= 'ordered' | kw= 'package' | kw= 'postcondition' | kw= 'precondition' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'reference' | kw= 'resolve' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) )
            // InternalOCLinEcore.g:210:1: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'callable' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derivation' | kw= 'derived' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'import' | kw= 'initial' | kw= 'interface' | kw= 'key' | kw= 'library' | kw= 'module' | kw= 'operation' | kw= 'ordered' | kw= 'package' | kw= 'postcondition' | kw= 'precondition' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'reference' | kw= 'resolve' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            {
            // InternalOCLinEcore.g:210:1: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'callable' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derivation' | kw= 'derived' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'import' | kw= 'initial' | kw= 'interface' | kw= 'key' | kw= 'library' | kw= 'module' | kw= 'operation' | kw= 'ordered' | kw= 'package' | kw= 'postcondition' | kw= 'precondition' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'reference' | kw= 'resolve' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            int alt5=36;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
                {
                alt5=1;
                }
                break;
            case 19:
                {
                alt5=2;
                }
                break;
            case 20:
                {
                alt5=3;
                }
                break;
            case 21:
                {
                alt5=4;
                }
                break;
            case 22:
                {
                alt5=5;
                }
                break;
            case 23:
                {
                alt5=6;
                }
                break;
            case 24:
                {
                alt5=7;
                }
                break;
            case 25:
                {
                alt5=8;
                }
                break;
            case 26:
                {
                alt5=9;
                }
                break;
            case 27:
                {
                alt5=10;
                }
                break;
            case 28:
                {
                alt5=11;
                }
                break;
            case 29:
                {
                alt5=12;
                }
                break;
            case 30:
                {
                alt5=13;
                }
                break;
            case 31:
                {
                alt5=14;
                }
                break;
            case 32:
                {
                alt5=15;
                }
                break;
            case 33:
                {
                alt5=16;
                }
                break;
            case 34:
                {
                alt5=17;
                }
                break;
            case 35:
                {
                alt5=18;
                }
                break;
            case 36:
                {
                alt5=19;
                }
                break;
            case 17:
                {
                alt5=20;
                }
                break;
            case 37:
                {
                alt5=21;
                }
                break;
            case 38:
                {
                alt5=22;
                }
                break;
            case 39:
                {
                alt5=23;
                }
                break;
            case 40:
                {
                alt5=24;
                }
                break;
            case 41:
                {
                alt5=25;
                }
                break;
            case 42:
                {
                alt5=26;
                }
                break;
            case 43:
                {
                alt5=27;
                }
                break;
            case 44:
                {
                alt5=28;
                }
                break;
            case 45:
                {
                alt5=29;
                }
                break;
            case 46:
                {
                alt5=30;
                }
                break;
            case 47:
                {
                alt5=31;
                }
                break;
            case 48:
                {
                alt5=32;
                }
                break;
            case 49:
                {
                alt5=33;
                }
                break;
            case 50:
                {
                alt5=34;
                }
                break;
            case 51:
                {
                alt5=35;
                }
                break;
            case 52:
                {
                alt5=36;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 5, 0, input);

                throw nvae;
            }

            switch (alt5) {
                case 1 :
                    // InternalOCLinEcore.g:211:5: this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getEnumerationLiteralNameAccess().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 :
                    // InternalOCLinEcore.g:223:2: kw= 'abstract'
                    {
                    kw=(Token)match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getAbstractKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:230:2: kw= 'attribute'
                    {
                    kw=(Token)match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getAttributeKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:237:2: kw= 'body'
                    {
                    kw=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getBodyKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:244:2: kw= 'callable'
                    {
                    kw=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getCallableKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:251:2: kw= 'class'
                    {
                    kw=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getClassKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:258:2: kw= 'composes'
                    {
                    kw=(Token)match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getComposesKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:265:2: kw= 'datatype'
                    {
                    kw=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getDatatypeKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:272:2: kw= 'definition'
                    {
                    kw=(Token)match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getDefinitionKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:279:2: kw= 'derivation'
                    {
                    kw=(Token)match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getDerivationKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:286:2: kw= 'derived'
                    {
                    kw=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getDerivedKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:293:2: kw= 'enum'
                    {
                    kw=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getEnumKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:300:2: kw= 'extends'
                    {
                    kw=(Token)match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getExtendsKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:307:2: kw= 'id'
                    {
                    kw=(Token)match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getIdKeyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalOCLinEcore.g:314:2: kw= 'import'
                    {
                    kw=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getImportKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalOCLinEcore.g:321:2: kw= 'initial'
                    {
                    kw=(Token)match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getInitialKeyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalOCLinEcore.g:328:2: kw= 'interface'
                    {
                    kw=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getInterfaceKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalOCLinEcore.g:335:2: kw= 'key'
                    {
                    kw=(Token)match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getKeyKeyword_17());

                    }

                    }
                    break;
                case 19 :
                    // InternalOCLinEcore.g:342:2: kw= 'library'
                    {
                    kw=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getLibraryKeyword_18());

                    }

                    }
                    break;
                case 20 :
                    // InternalOCLinEcore.g:349:2: kw= 'module'
                    {
                    kw=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getModuleKeyword_19());

                    }

                    }
                    break;
                case 21 :
                    // InternalOCLinEcore.g:356:2: kw= 'operation'
                    {
                    kw=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getOperationKeyword_20());

                    }

                    }
                    break;
                case 22 :
                    // InternalOCLinEcore.g:363:2: kw= 'ordered'
                    {
                    kw=(Token)match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getOrderedKeyword_21());

                    }

                    }
                    break;
                case 23 :
                    // InternalOCLinEcore.g:370:2: kw= 'package'
                    {
                    kw=(Token)match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getPackageKeyword_22());

                    }

                    }
                    break;
                case 24 :
                    // InternalOCLinEcore.g:377:2: kw= 'postcondition'
                    {
                    kw=(Token)match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getPostconditionKeyword_23());

                    }

                    }
                    break;
                case 25 :
                    // InternalOCLinEcore.g:384:2: kw= 'precondition'
                    {
                    kw=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getPreconditionKeyword_24());

                    }

                    }
                    break;
                case 26 :
                    // InternalOCLinEcore.g:391:2: kw= 'primitive'
                    {
                    kw=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getPrimitiveKeyword_25());

                    }

                    }
                    break;
                case 27 :
                    // InternalOCLinEcore.g:398:2: kw= 'property'
                    {
                    kw=(Token)match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getPropertyKeyword_26());

                    }

                    }
                    break;
                case 28 :
                    // InternalOCLinEcore.g:405:2: kw= 'readonly'
                    {
                    kw=(Token)match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getReadonlyKeyword_27());

                    }

                    }
                    break;
                case 29 :
                    // InternalOCLinEcore.g:412:2: kw= 'reference'
                    {
                    kw=(Token)match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getReferenceKeyword_28());

                    }

                    }
                    break;
                case 30 :
                    // InternalOCLinEcore.g:419:2: kw= 'resolve'
                    {
                    kw=(Token)match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getResolveKeyword_29());

                    }

                    }
                    break;
                case 31 :
                    // InternalOCLinEcore.g:426:2: kw= 'static'
                    {
                    kw=(Token)match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getStaticKeyword_30());

                    }

                    }
                    break;
                case 32 :
                    // InternalOCLinEcore.g:433:2: kw= 'throws'
                    {
                    kw=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getThrowsKeyword_31());

                    }

                    }
                    break;
                case 33 :
                    // InternalOCLinEcore.g:440:2: kw= 'transient'
                    {
                    kw=(Token)match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getTransientKeyword_32());

                    }

                    }
                    break;
                case 34 :
                    // InternalOCLinEcore.g:447:2: kw= 'unique'
                    {
                    kw=(Token)match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getUniqueKeyword_33());

                    }

                    }
                    break;
                case 35 :
                    // InternalOCLinEcore.g:454:2: kw= 'unsettable'
                    {
                    kw=(Token)match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getUnsettableKeyword_34());

                    }

                    }
                    break;
                case 36 :
                    // InternalOCLinEcore.g:461:2: kw= 'volatile'
                    {
                    kw=(Token)match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEnumerationLiteralNameAccess().getVolatileKeyword_35());

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleInvariantConstraintCS"
    // InternalOCLinEcore.g:474:1: entryRuleInvariantConstraintCS returns [EObject current=null] : iv_ruleInvariantConstraintCS= ruleInvariantConstraintCS EOF ;
    public final EObject entryRuleInvariantConstraintCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInvariantConstraintCS = null;


        try {
            // InternalOCLinEcore.g:475:2: (iv_ruleInvariantConstraintCS= ruleInvariantConstraintCS EOF )
            // InternalOCLinEcore.g:476:2: iv_ruleInvariantConstraintCS= ruleInvariantConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInvariantConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInvariantConstraintCS=ruleInvariantConstraintCS();

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

            }

        }

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


    // $ANTLR start "ruleInvariantConstraintCS"
    // InternalOCLinEcore.g:483:1: ruleInvariantConstraintCS returns [EObject current=null] : ( ( (lv_isCallable_0_0= 'callable' ) )? ( (lv_stereotype_1_0= 'invariant' ) ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )? ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' ) ) ;
    public final EObject ruleInvariantConstraintCS() throws RecognitionException {
        EObject current = null;

        Token lv_isCallable_0_0=null;
        Token lv_stereotype_1_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedMessageSpecification_4_0 = null;

        EObject lv_ownedSpecification_7_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:486:28: ( ( ( (lv_isCallable_0_0= 'callable' ) )? ( (lv_stereotype_1_0= 'invariant' ) ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )? ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' ) ) )
            // InternalOCLinEcore.g:487:1: ( ( (lv_isCallable_0_0= 'callable' ) )? ( (lv_stereotype_1_0= 'invariant' ) ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )? ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' ) )
            {
            // InternalOCLinEcore.g:487:1: ( ( (lv_isCallable_0_0= 'callable' ) )? ( (lv_stereotype_1_0= 'invariant' ) ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )? ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' ) )
            // InternalOCLinEcore.g:487:2: ( (lv_isCallable_0_0= 'callable' ) )? ( (lv_stereotype_1_0= 'invariant' ) ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )? ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' )
            {
            // InternalOCLinEcore.g:487:2: ( (lv_isCallable_0_0= 'callable' ) )?
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==22) ) {
                alt6=1;
            }
            switch (alt6) {
                case 1 :
                    // InternalOCLinEcore.g:488:1: (lv_isCallable_0_0= 'callable' )
                    {
                    // InternalOCLinEcore.g:488:1: (lv_isCallable_0_0= 'callable' )
                    // InternalOCLinEcore.g:489:3: lv_isCallable_0_0= 'callable'
                    {
                    lv_isCallable_0_0=(Token)match(input,22,FollowSets000.FOLLOW_7); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isCallable_0_0, grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getInvariantConstraintCSRule());
                      	        }
                             		setWithLastConsumed(current, "isCallable", true, "callable");

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:502:3: ( (lv_stereotype_1_0= 'invariant' ) )
            // InternalOCLinEcore.g:503:1: (lv_stereotype_1_0= 'invariant' )
            {
            // InternalOCLinEcore.g:503:1: (lv_stereotype_1_0= 'invariant' )
            // InternalOCLinEcore.g:504:3: lv_stereotype_1_0= 'invariant'
            {
            lv_stereotype_1_0=(Token)match(input,53,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_stereotype_1_0, grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getInvariantConstraintCSRule());
              	        }
                     		setWithLastConsumed(current, "stereotype", lv_stereotype_1_0, "invariant");

            }

            }


            }

            // InternalOCLinEcore.g:517:2: ( ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )? )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( ((LA8_0>=RULE_SIMPLE_ID && LA8_0<=RULE_ESCAPED_ID)||LA8_0==17||(LA8_0>=19 && LA8_0<=53)||LA8_0==58||LA8_0==71||(LA8_0>=73 && LA8_0<=74)||LA8_0==76||LA8_0==80) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // InternalOCLinEcore.g:517:3: ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )?
                    {
                    // InternalOCLinEcore.g:517:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:518:1: (lv_name_2_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:518:1: (lv_name_2_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:519:3: lv_name_2_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getInvariantConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());

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

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getInvariantConstraintCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_2_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:535:2: (otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')' )?
                    int alt7=2;
                    int LA7_0 = input.LA(1);

                    if ( (LA7_0==54) ) {
                        alt7=1;
                    }
                    switch (alt7) {
                        case 1 :
                            // InternalOCLinEcore.g:535:4: otherlv_3= '(' ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) ) otherlv_5= ')'
                            {
                            otherlv_3=(Token)match(input,54,FollowSets000.FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_3, grammarAccess.getInvariantConstraintCSAccess().getLeftParenthesisKeyword_2_1_0());

                            }
                            // InternalOCLinEcore.g:539:1: ( (lv_ownedMessageSpecification_4_0= ruleSpecificationCS ) )
                            // InternalOCLinEcore.g:540:1: (lv_ownedMessageSpecification_4_0= ruleSpecificationCS )
                            {
                            // InternalOCLinEcore.g:540:1: (lv_ownedMessageSpecification_4_0= ruleSpecificationCS )
                            // InternalOCLinEcore.g:541:3: lv_ownedMessageSpecification_4_0= ruleSpecificationCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_2_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            lv_ownedMessageSpecification_4_0=ruleSpecificationCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getInvariantConstraintCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedMessageSpecification",
                                      		lv_ownedMessageSpecification_4_0,
                                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

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

                                  	newLeafNode(otherlv_5, grammarAccess.getInvariantConstraintCSAccess().getRightParenthesisKeyword_2_1_2());

                            }

                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:561:5: ( (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' ) | otherlv_9= ';' )
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==56) ) {
                alt10=1;
            }
            else if ( (LA10_0==57) ) {
                alt10=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 10, 0, input);

                throw nvae;
            }
            switch (alt10) {
                case 1 :
                    // InternalOCLinEcore.g:561:6: (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' )
                    {
                    // InternalOCLinEcore.g:561:6: (otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';' )
                    // InternalOCLinEcore.g:561:8: otherlv_6= ':' ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )? otherlv_8= ';'
                    {
                    otherlv_6=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getInvariantConstraintCSAccess().getColonKeyword_3_0_0());

                    }
                    // InternalOCLinEcore.g:565:1: ( (lv_ownedSpecification_7_0= ruleSpecificationCS ) )?
                    int alt9=2;
                    int LA9_0 = input.LA(1);

                    if ( ((LA9_0>=RULE_INT && LA9_0<=RULE_SINGLE_QUOTED_STRING)||(LA9_0>=RULE_UNQUOTED_STRING && LA9_0<=RULE_ESCAPED_ID)||(LA9_0>=17 && LA9_0<=54)||LA9_0==58||LA9_0==71||(LA9_0>=73 && LA9_0<=74)||LA9_0==76||LA9_0==80||(LA9_0>=83 && LA9_0<=84)||(LA9_0>=98 && LA9_0<=99)||(LA9_0>=101 && LA9_0<=113)||LA9_0==116||(LA9_0>=118 && LA9_0<=121)||LA9_0==128||(LA9_0>=133 && LA9_0<=134)) ) {
                        alt9=1;
                    }
                    switch (alt9) {
                        case 1 :
                            // InternalOCLinEcore.g:566:1: (lv_ownedSpecification_7_0= ruleSpecificationCS )
                            {
                            // InternalOCLinEcore.g:566:1: (lv_ownedSpecification_7_0= ruleSpecificationCS )
                            // InternalOCLinEcore.g:567:3: lv_ownedSpecification_7_0= ruleSpecificationCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_14);
                            lv_ownedSpecification_7_0=ruleSpecificationCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getInvariantConstraintCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedSpecification",
                                      		lv_ownedSpecification_7_0,
                                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_8, grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:588:7: otherlv_9= ';'
                    {
                    otherlv_9=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_1());

                    }

                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRulePostconditionConstraintCS"
    // InternalOCLinEcore.g:600:1: entryRulePostconditionConstraintCS returns [EObject current=null] : iv_rulePostconditionConstraintCS= rulePostconditionConstraintCS EOF ;
    public final EObject entryRulePostconditionConstraintCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePostconditionConstraintCS = null;


        try {
            // InternalOCLinEcore.g:601:2: (iv_rulePostconditionConstraintCS= rulePostconditionConstraintCS EOF )
            // InternalOCLinEcore.g:602:2: iv_rulePostconditionConstraintCS= rulePostconditionConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPostconditionConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePostconditionConstraintCS=rulePostconditionConstraintCS();

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

            }

        }

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


    // $ANTLR start "rulePostconditionConstraintCS"
    // InternalOCLinEcore.g:609:1: rulePostconditionConstraintCS returns [EObject current=null] : ( ( (lv_stereotype_0_0= 'postcondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' ) ;
    public final EObject rulePostconditionConstraintCS() throws RecognitionException {
        EObject current = null;

        Token lv_stereotype_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedMessageSpecification_3_0 = null;

        EObject lv_ownedSpecification_6_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:612:28: ( ( ( (lv_stereotype_0_0= 'postcondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' ) )
            // InternalOCLinEcore.g:613:1: ( ( (lv_stereotype_0_0= 'postcondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' )
            {
            // InternalOCLinEcore.g:613:1: ( ( (lv_stereotype_0_0= 'postcondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' )
            // InternalOCLinEcore.g:613:2: ( (lv_stereotype_0_0= 'postcondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';'
            {
            // InternalOCLinEcore.g:613:2: ( (lv_stereotype_0_0= 'postcondition' ) )
            // InternalOCLinEcore.g:614:1: (lv_stereotype_0_0= 'postcondition' )
            {
            // InternalOCLinEcore.g:614:1: (lv_stereotype_0_0= 'postcondition' )
            // InternalOCLinEcore.g:615:3: lv_stereotype_0_0= 'postcondition'
            {
            lv_stereotype_0_0=(Token)match(input,40,FollowSets000.FOLLOW_15); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_stereotype_0_0, grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getPostconditionConstraintCSRule());
              	        }
                     		setWithLastConsumed(current, "stereotype", lv_stereotype_0_0, "postcondition");

            }

            }


            }

            // InternalOCLinEcore.g:628:2: ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( ((LA12_0>=RULE_SIMPLE_ID && LA12_0<=RULE_ESCAPED_ID)||LA12_0==17||(LA12_0>=19 && LA12_0<=53)||LA12_0==58||LA12_0==71||(LA12_0>=73 && LA12_0<=74)||LA12_0==76||LA12_0==80) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // InternalOCLinEcore.g:628:3: ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )?
                    {
                    // InternalOCLinEcore.g:628:3: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:629:1: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:629:1: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:630:3: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPostconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());

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

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPostconditionConstraintCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:646:2: (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )?
                    int alt11=2;
                    int LA11_0 = input.LA(1);

                    if ( (LA11_0==54) ) {
                        alt11=1;
                    }
                    switch (alt11) {
                        case 1 :
                            // InternalOCLinEcore.g:646:4: otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')'
                            {
                            otherlv_2=(Token)match(input,54,FollowSets000.FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_2, grammarAccess.getPostconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());

                            }
                            // InternalOCLinEcore.g:650:1: ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) )
                            // InternalOCLinEcore.g:651:1: (lv_ownedMessageSpecification_3_0= ruleSpecificationCS )
                            {
                            // InternalOCLinEcore.g:651:1: (lv_ownedMessageSpecification_3_0= ruleSpecificationCS )
                            // InternalOCLinEcore.g:652:3: lv_ownedMessageSpecification_3_0= ruleSpecificationCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            lv_ownedMessageSpecification_3_0=ruleSpecificationCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getPostconditionConstraintCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedMessageSpecification",
                                      		lv_ownedMessageSpecification_3_0,
                                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

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

                                  	newLeafNode(otherlv_4, grammarAccess.getPostconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());

                            }

                            }
                            break;

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getPostconditionConstraintCSAccess().getColonKeyword_2());

            }
            // InternalOCLinEcore.g:676:1: ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )?
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( ((LA13_0>=RULE_INT && LA13_0<=RULE_SINGLE_QUOTED_STRING)||(LA13_0>=RULE_UNQUOTED_STRING && LA13_0<=RULE_ESCAPED_ID)||(LA13_0>=17 && LA13_0<=54)||LA13_0==58||LA13_0==71||(LA13_0>=73 && LA13_0<=74)||LA13_0==76||LA13_0==80||(LA13_0>=83 && LA13_0<=84)||(LA13_0>=98 && LA13_0<=99)||(LA13_0>=101 && LA13_0<=113)||LA13_0==116||(LA13_0>=118 && LA13_0<=121)||LA13_0==128||(LA13_0>=133 && LA13_0<=134)) ) {
                alt13=1;
            }
            switch (alt13) {
                case 1 :
                    // InternalOCLinEcore.g:677:1: (lv_ownedSpecification_6_0= ruleSpecificationCS )
                    {
                    // InternalOCLinEcore.g:677:1: (lv_ownedSpecification_6_0= ruleSpecificationCS )
                    // InternalOCLinEcore.g:678:3: lv_ownedSpecification_6_0= ruleSpecificationCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_14);
                    lv_ownedSpecification_6_0=ruleSpecificationCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPostconditionConstraintCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSpecification",
                              		lv_ownedSpecification_6_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getPostconditionConstraintCSAccess().getSemicolonKeyword_4());

            }

            }


            }

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

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


    // $ANTLR start "entryRulePreconditionConstraintCS"
    // InternalOCLinEcore.g:706:1: entryRulePreconditionConstraintCS returns [EObject current=null] : iv_rulePreconditionConstraintCS= rulePreconditionConstraintCS EOF ;
    public final EObject entryRulePreconditionConstraintCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePreconditionConstraintCS = null;


        try {
            // InternalOCLinEcore.g:707:2: (iv_rulePreconditionConstraintCS= rulePreconditionConstraintCS EOF )
            // InternalOCLinEcore.g:708:2: iv_rulePreconditionConstraintCS= rulePreconditionConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPreconditionConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePreconditionConstraintCS=rulePreconditionConstraintCS();

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

            }

        }

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


    // $ANTLR start "rulePreconditionConstraintCS"
    // InternalOCLinEcore.g:715:1: rulePreconditionConstraintCS returns [EObject current=null] : ( ( (lv_stereotype_0_0= 'precondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' ) ;
    public final EObject rulePreconditionConstraintCS() throws RecognitionException {
        EObject current = null;

        Token lv_stereotype_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedMessageSpecification_3_0 = null;

        EObject lv_ownedSpecification_6_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:718:28: ( ( ( (lv_stereotype_0_0= 'precondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' ) )
            // InternalOCLinEcore.g:719:1: ( ( (lv_stereotype_0_0= 'precondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' )
            {
            // InternalOCLinEcore.g:719:1: ( ( (lv_stereotype_0_0= 'precondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';' )
            // InternalOCLinEcore.g:719:2: ( (lv_stereotype_0_0= 'precondition' ) ) ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )? otherlv_5= ':' ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )? otherlv_7= ';'
            {
            // InternalOCLinEcore.g:719:2: ( (lv_stereotype_0_0= 'precondition' ) )
            // InternalOCLinEcore.g:720:1: (lv_stereotype_0_0= 'precondition' )
            {
            // InternalOCLinEcore.g:720:1: (lv_stereotype_0_0= 'precondition' )
            // InternalOCLinEcore.g:721:3: lv_stereotype_0_0= 'precondition'
            {
            lv_stereotype_0_0=(Token)match(input,41,FollowSets000.FOLLOW_15); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                      newLeafNode(lv_stereotype_0_0, grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getPreconditionConstraintCSRule());
              	        }
                     		setWithLastConsumed(current, "stereotype", lv_stereotype_0_0, "precondition");

            }

            }


            }

            // InternalOCLinEcore.g:734:2: ( ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )? )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( ((LA15_0>=RULE_SIMPLE_ID && LA15_0<=RULE_ESCAPED_ID)||LA15_0==17||(LA15_0>=19 && LA15_0<=53)||LA15_0==58||LA15_0==71||(LA15_0>=73 && LA15_0<=74)||LA15_0==76||LA15_0==80) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // InternalOCLinEcore.g:734:3: ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )?
                    {
                    // InternalOCLinEcore.g:734:3: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:735:1: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:735:1: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:736:3: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPreconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());

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

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPreconditionConstraintCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_1_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:752:2: (otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')' )?
                    int alt14=2;
                    int LA14_0 = input.LA(1);

                    if ( (LA14_0==54) ) {
                        alt14=1;
                    }
                    switch (alt14) {
                        case 1 :
                            // InternalOCLinEcore.g:752:4: otherlv_2= '(' ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) ) otherlv_4= ')'
                            {
                            otherlv_2=(Token)match(input,54,FollowSets000.FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_2, grammarAccess.getPreconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());

                            }
                            // InternalOCLinEcore.g:756:1: ( (lv_ownedMessageSpecification_3_0= ruleSpecificationCS ) )
                            // InternalOCLinEcore.g:757:1: (lv_ownedMessageSpecification_3_0= ruleSpecificationCS )
                            {
                            // InternalOCLinEcore.g:757:1: (lv_ownedMessageSpecification_3_0= ruleSpecificationCS )
                            // InternalOCLinEcore.g:758:3: lv_ownedMessageSpecification_3_0= ruleSpecificationCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            lv_ownedMessageSpecification_3_0=ruleSpecificationCS();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getPreconditionConstraintCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"ownedMessageSpecification",
                                      		lv_ownedMessageSpecification_3_0,
                                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                              	        afterParserOrEnumRuleCall();

                            }

                            }


                            }

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

                                  	newLeafNode(otherlv_4, grammarAccess.getPreconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());

                            }

                            }
                            break;

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_5, grammarAccess.getPreconditionConstraintCSAccess().getColonKeyword_2());

            }
            // InternalOCLinEcore.g:782:1: ( (lv_ownedSpecification_6_0= ruleSpecificationCS ) )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( ((LA16_0>=RULE_INT && LA16_0<=RULE_SINGLE_QUOTED_STRING)||(LA16_0>=RULE_UNQUOTED_STRING && LA16_0<=RULE_ESCAPED_ID)||(LA16_0>=17 && LA16_0<=54)||LA16_0==58||LA16_0==71||(LA16_0>=73 && LA16_0<=74)||LA16_0==76||LA16_0==80||(LA16_0>=83 && LA16_0<=84)||(LA16_0>=98 && LA16_0<=99)||(LA16_0>=101 && LA16_0<=113)||LA16_0==116||(LA16_0>=118 && LA16_0<=121)||LA16_0==128||(LA16_0>=133 && LA16_0<=134)) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // InternalOCLinEcore.g:783:1: (lv_ownedSpecification_6_0= ruleSpecificationCS )
                    {
                    // InternalOCLinEcore.g:783:1: (lv_ownedSpecification_6_0= ruleSpecificationCS )
                    // InternalOCLinEcore.g:784:3: lv_ownedSpecification_6_0= ruleSpecificationCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_14);
                    lv_ownedSpecification_6_0=ruleSpecificationCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPreconditionConstraintCSRule());
                      	        }
                             		set(
                             			current,
                             			"ownedSpecification",
                              		lv_ownedSpecification_6_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getPreconditionConstraintCSAccess().getSemicolonKeyword_4());

            }

            }


            }

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

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


    // $ANTLR start "entryRuleAnnotationCS"
    // InternalOCLinEcore.g:812:1: entryRuleAnnotationCS returns [EObject current=null] : iv_ruleAnnotationCS= ruleAnnotationCS EOF ;
    public final EObject entryRuleAnnotationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnnotationCS = null;


        try {
            // InternalOCLinEcore.g:813:2: (iv_ruleAnnotationCS= ruleAnnotationCS EOF )
            // InternalOCLinEcore.g:814:2: iv_ruleAnnotationCS= ruleAnnotationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAnnotationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAnnotationCS=ruleAnnotationCS();

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

            }

        }

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


    // $ANTLR start "ruleAnnotationCS"
    // InternalOCLinEcore.g:821:1: ruleAnnotationCS returns [EObject current=null] : ( () otherlv_1= 'annotation' ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' ) ) ;
    public final EObject ruleAnnotationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_name_2_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        AntlrDatatypeRuleToken lv_name_2_1 = null;

        EObject lv_ownedDetails_4_0 = null;

        EObject lv_ownedDetails_6_0 = null;

        EObject lv_ownedAnnotations_9_0 = null;

        EObject lv_ownedContents_10_0 = null;

        EObject lv_ownedReferences_11_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:824:28: ( ( () otherlv_1= 'annotation' ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' ) ) )
            // InternalOCLinEcore.g:825:1: ( () otherlv_1= 'annotation' ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' ) )
            {
            // InternalOCLinEcore.g:825:1: ( () otherlv_1= 'annotation' ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' ) )
            // InternalOCLinEcore.g:825:2: () otherlv_1= 'annotation' ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' )
            {
            // InternalOCLinEcore.g:825:2: ()
            // InternalOCLinEcore.g:826:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getAnnotationCSAccess().getAnnotationCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getAnnotationCSAccess().getAnnotationKeyword_1());

            }
            // InternalOCLinEcore.g:838:1: ( ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==RULE_SINGLE_QUOTED_STRING||(LA18_0>=RULE_SIMPLE_ID && LA18_0<=RULE_ESCAPED_ID)||LA18_0==17||(LA18_0>=19 && LA18_0<=53)||LA18_0==58||LA18_0==71||(LA18_0>=73 && LA18_0<=74)||LA18_0==76||LA18_0==80) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // InternalOCLinEcore.g:839:1: ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    // InternalOCLinEcore.g:839:1: ( (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:840:1: (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:840:1: (lv_name_2_1= ruleUnrestrictedName | lv_name_2_2= RULE_SINGLE_QUOTED_STRING )
                    int alt17=2;
                    int LA17_0 = input.LA(1);

                    if ( ((LA17_0>=RULE_SIMPLE_ID && LA17_0<=RULE_ESCAPED_ID)||LA17_0==17||(LA17_0>=19 && LA17_0<=53)||LA17_0==58||LA17_0==71||(LA17_0>=73 && LA17_0<=74)||LA17_0==76||LA17_0==80) ) {
                        alt17=1;
                    }
                    else if ( (LA17_0==RULE_SINGLE_QUOTED_STRING) ) {
                        alt17=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 17, 0, input);

                        throw nvae;
                    }
                    switch (alt17) {
                        case 1 :
                            // InternalOCLinEcore.g:841:3: lv_name_2_1= ruleUnrestrictedName
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_19);
                            lv_name_2_1=ruleUnrestrictedName();

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

                              	        if (current==null) {
                              	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                              	        }
                                     		set(
                                     			current,
                                     			"name",
                                      		lv_name_2_1,
                                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                              	        afterParserOrEnumRuleCall();

                            }

                            }
                            break;
                        case 2 :
                            // InternalOCLinEcore.g:856:8: lv_name_2_2= RULE_SINGLE_QUOTED_STRING
                            {
                            lv_name_2_2=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              			newLeafNode(lv_name_2_2, grammarAccess.getAnnotationCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());

                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getAnnotationCSRule());
                              	        }
                                     		setWithLastConsumed(
                                     			current,
                                     			"name",
                                      		lv_name_2_2,
                                      		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                            }

                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:874:3: (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==54) ) {
                alt20=1;
            }
            switch (alt20) {
                case 1 :
                    // InternalOCLinEcore.g:874:5: otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')'
                    {
                    otherlv_3=(Token)match(input,54,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:878:1: ( (lv_ownedDetails_4_0= ruleDetailCS ) )
                    // InternalOCLinEcore.g:879:1: (lv_ownedDetails_4_0= ruleDetailCS )
                    {
                    // InternalOCLinEcore.g:879:1: (lv_ownedDetails_4_0= ruleDetailCS )
                    // InternalOCLinEcore.g:880:3: lv_ownedDetails_4_0= ruleDetailCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_21);
                    lv_ownedDetails_4_0=ruleDetailCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedDetails",
                              		lv_ownedDetails_4_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:896:2: (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )*
                    loop19:
                    do {
                        int alt19=2;
                        int LA19_0 = input.LA(1);

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


                        switch (alt19) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:896:4: otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) )
                    	    {
                    	    otherlv_5=(Token)match(input,59,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getAnnotationCSAccess().getCommaKeyword_3_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:900:1: ( (lv_ownedDetails_6_0= ruleDetailCS ) )
                    	    // InternalOCLinEcore.g:901:1: (lv_ownedDetails_6_0= ruleDetailCS )
                    	    {
                    	    // InternalOCLinEcore.g:901:1: (lv_ownedDetails_6_0= ruleDetailCS )
                    	    // InternalOCLinEcore.g:902:3: lv_ownedDetails_6_0= ruleDetailCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_21);
                    	    lv_ownedDetails_6_0=ruleDetailCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedDetails",
                    	              		lv_ownedDetails_6_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_7, grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_3_3());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:922:3: ( (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' ) | otherlv_13= ';' )
            int alt22=2;
            int LA22_0 = input.LA(1);

            if ( (LA22_0==60) ) {
                alt22=1;
            }
            else if ( (LA22_0==57) ) {
                alt22=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 22, 0, input);

                throw nvae;
            }
            switch (alt22) {
                case 1 :
                    // InternalOCLinEcore.g:922:4: (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' )
                    {
                    // InternalOCLinEcore.g:922:4: (otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}' )
                    // InternalOCLinEcore.g:922:6: otherlv_8= '{' ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+ otherlv_12= '}'
                    {
                    otherlv_8=(Token)match(input,60,FollowSets000.FOLLOW_23); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_4_0_0());

                    }
                    // InternalOCLinEcore.g:926:1: ( ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) ) | ( (lv_ownedContents_10_0= ruleModelElementCS ) ) | ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) ) )+
                    int cnt21=0;
                    loop21:
                    do {
                        int alt21=4;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt21=1;
                            }
                            break;
                        case RULE_SIMPLE_ID:
                        case RULE_ESCAPED_ID:
                        case 17:
                        case 19:
                        case 20:
                        case 21:
                        case 22:
                        case 23:
                        case 24:
                        case 25:
                        case 26:
                        case 27:
                        case 28:
                        case 29:
                        case 30:
                        case 31:
                        case 32:
                        case 33:
                        case 34:
                        case 35:
                        case 36:
                        case 37:
                        case 38:
                        case 39:
                        case 40:
                        case 41:
                        case 42:
                        case 43:
                        case 44:
                        case 46:
                        case 47:
                        case 48:
                        case 49:
                        case 50:
                        case 51:
                        case 52:
                        case 74:
                            {
                            alt21=2;
                            }
                            break;
                        case 45:
                            {
                            int LA21_4 = input.LA(2);

                            if ( ((LA21_4>=RULE_SIMPLE_ID && LA21_4<=RULE_ESCAPED_ID)||LA21_4==17||(LA21_4>=19 && LA21_4<=53)||LA21_4==58||LA21_4==71||(LA21_4>=73 && LA21_4<=74)||LA21_4==76||LA21_4==80) ) {
                                alt21=3;
                            }
                            else if ( ((LA21_4>=56 && LA21_4<=57)||LA21_4==60||LA21_4==62) ) {
                                alt21=2;
                            }


                            }
                            break;

                        }

                        switch (alt21) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:926:2: ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:926:2: ( (lv_ownedAnnotations_9_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:927:1: (lv_ownedAnnotations_9_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:927:1: (lv_ownedAnnotations_9_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:928:3: lv_ownedAnnotations_9_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_24);
                    	    lv_ownedAnnotations_9_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_9_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:945:6: ( (lv_ownedContents_10_0= ruleModelElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:945:6: ( (lv_ownedContents_10_0= ruleModelElementCS ) )
                    	    // InternalOCLinEcore.g:946:1: (lv_ownedContents_10_0= ruleModelElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:946:1: (lv_ownedContents_10_0= ruleModelElementCS )
                    	    // InternalOCLinEcore.g:947:3: lv_ownedContents_10_0= ruleModelElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getOwnedContentsModelElementCSParserRuleCall_4_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_24);
                    	    lv_ownedContents_10_0=ruleModelElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedContents",
                    	              		lv_ownedContents_10_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.ModelElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:964:6: ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:964:6: ( (lv_ownedReferences_11_0= ruleModelElementRefCS ) )
                    	    // InternalOCLinEcore.g:965:1: (lv_ownedReferences_11_0= ruleModelElementRefCS )
                    	    {
                    	    // InternalOCLinEcore.g:965:1: (lv_ownedReferences_11_0= ruleModelElementRefCS )
                    	    // InternalOCLinEcore.g:966:3: lv_ownedReferences_11_0= ruleModelElementRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAnnotationCSAccess().getOwnedReferencesModelElementRefCSParserRuleCall_4_0_1_2_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_24);
                    	    lv_ownedReferences_11_0=ruleModelElementRefCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAnnotationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedReferences",
                    	              		lv_ownedReferences_11_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.ModelElementRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_12, grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_4_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:987:7: otherlv_13= ';'
                    {
                    otherlv_13=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_13, grammarAccess.getAnnotationCSAccess().getSemicolonKeyword_4_1());

                    }

                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleAnnotationElementCS"
    // InternalOCLinEcore.g:999:1: entryRuleAnnotationElementCS returns [EObject current=null] : iv_ruleAnnotationElementCS= ruleAnnotationElementCS EOF ;
    public final EObject entryRuleAnnotationElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnnotationElementCS = null;


        try {
            // InternalOCLinEcore.g:1000:2: (iv_ruleAnnotationElementCS= ruleAnnotationElementCS EOF )
            // InternalOCLinEcore.g:1001:2: iv_ruleAnnotationElementCS= ruleAnnotationElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAnnotationElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAnnotationElementCS=ruleAnnotationElementCS();

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

            }

        }

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


    // $ANTLR start "ruleAnnotationElementCS"
    // InternalOCLinEcore.g:1008:1: ruleAnnotationElementCS returns [EObject current=null] : (this_AnnotationCS_0= ruleAnnotationCS | this_DocumentationCS_1= ruleDocumentationCS | this_SysMLCS_2= ruleSysMLCS ) ;
    public final EObject ruleAnnotationElementCS() throws RecognitionException {
        EObject current = null;

        EObject this_AnnotationCS_0 = null;

        EObject this_DocumentationCS_1 = null;

        EObject this_SysMLCS_2 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:1011:28: ( (this_AnnotationCS_0= ruleAnnotationCS | this_DocumentationCS_1= ruleDocumentationCS | this_SysMLCS_2= ruleSysMLCS ) )
            // InternalOCLinEcore.g:1012:1: (this_AnnotationCS_0= ruleAnnotationCS | this_DocumentationCS_1= ruleDocumentationCS | this_SysMLCS_2= ruleSysMLCS )
            {
            // InternalOCLinEcore.g:1012:1: (this_AnnotationCS_0= ruleAnnotationCS | this_DocumentationCS_1= ruleDocumentationCS | this_SysMLCS_2= ruleSysMLCS )
            int alt23=3;
            switch ( input.LA(1) ) {
            case 58:
                {
                alt23=1;
                }
                break;
            case 73:
                {
                alt23=2;
                }
                break;
            case 80:
                {
                alt23=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 23, 0, input);

                throw nvae;
            }

            switch (alt23) {
                case 1 :
                    // InternalOCLinEcore.g:1013:2: this_AnnotationCS_0= ruleAnnotationCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getAnnotationElementCSAccess().getAnnotationCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AnnotationCS_0=ruleAnnotationCS();

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

                              current = this_AnnotationCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:1026:2: this_DocumentationCS_1= ruleDocumentationCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getAnnotationElementCSAccess().getDocumentationCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DocumentationCS_1=ruleDocumentationCS();

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

                              current = this_DocumentationCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:1039:2: this_SysMLCS_2= ruleSysMLCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getAnnotationElementCSAccess().getSysMLCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SysMLCS_2=ruleSysMLCS();

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

                              current = this_SysMLCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleAttributeCS"
    // InternalOCLinEcore.g:1058:1: entryRuleAttributeCS returns [EObject current=null] : iv_ruleAttributeCS= ruleAttributeCS EOF ;
    public final EObject entryRuleAttributeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeCS = null;


        try {
            // InternalOCLinEcore.g:1059:2: (iv_ruleAttributeCS= ruleAttributeCS EOF )
            // InternalOCLinEcore.g:1060: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"
    // InternalOCLinEcore.g:1067: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= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' ) ) ;
    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_31=null;
        Token otherlv_33=null;
        Token otherlv_35=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token otherlv_40=null;
        Token otherlv_41=null;
        Token otherlv_42=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedAnnotations_30_0 = null;

        EObject lv_ownedDefaultExpressions_34_0 = null;

        EObject lv_ownedDefaultExpressions_39_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:1070: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= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' ) ) )
            // InternalOCLinEcore.g:1071: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= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' ) )
            {
            // InternalOCLinEcore.g:1071: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= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' ) )
            // InternalOCLinEcore.g:1071: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= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' )
            {
            // InternalOCLinEcore.g:1071:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt26=3;
            int LA26_0 = input.LA(1);

            if ( (LA26_0==47) ) {
                alt26=1;
            }
            else if ( (LA26_0==26) ) {
                alt26=2;
            }
            switch (alt26) {
                case 1 :
                    // InternalOCLinEcore.g:1071:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalOCLinEcore.g:1071:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalOCLinEcore.g:1071:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalOCLinEcore.g:1071:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalOCLinEcore.g:1072:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalOCLinEcore.g:1072:1: (lv_qualifiers_0_0= 'static' )
                    // InternalOCLinEcore.g:1073:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,47,FollowSets000.FOLLOW_25); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:1086:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt24=2;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==26) ) {
                        alt24=1;
                    }
                    switch (alt24) {
                        case 1 :
                            // InternalOCLinEcore.g:1087:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalOCLinEcore.g:1087:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalOCLinEcore.g:1088:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,26,FollowSets000.FOLLOW_26); 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 :
                    // InternalOCLinEcore.g:1102:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalOCLinEcore.g:1102:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalOCLinEcore.g:1102:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalOCLinEcore.g:1102:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalOCLinEcore.g:1103:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalOCLinEcore.g:1103:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalOCLinEcore.g:1104:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,26,FollowSets000.FOLLOW_27); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:1117:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt25=2;
                    int LA25_0 = input.LA(1);

                    if ( (LA25_0==47) ) {
                        alt25=1;
                    }
                    switch (alt25) {
                        case 1 :
                            // InternalOCLinEcore.g:1118:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalOCLinEcore.g:1118:1: (lv_qualifiers_3_0= 'static' )
                            // InternalOCLinEcore.g:1119:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,47,FollowSets000.FOLLOW_26); 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,20,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());

            }
            // InternalOCLinEcore.g:1136:1: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:1137:1: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:1137:1: (lv_name_5_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:1138:3: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_28);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:1154:2: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt27=2;
            int LA27_0 = input.LA(1);

            if ( (LA27_0==56) ) {
                alt27=1;
            }
            switch (alt27) {
                case 1 :
                    // InternalOCLinEcore.g:1154:4: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_6=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:1158:1: ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    // InternalOCLinEcore.g:1159:1: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalOCLinEcore.g:1159:1: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    // InternalOCLinEcore.g:1160:3: lv_ownedType_7_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:1176:4: (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==62) ) {
                alt28=1;
            }
            switch (alt28) {
                case 1 :
                    // InternalOCLinEcore.g:1176:6: otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,62,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:1180:1: ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:1181:1: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:1181:1: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:1182:3: lv_default_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_22); 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;

            }

            // InternalOCLinEcore.g:1198: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 alt32=2;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==60) ) {
                int LA32_1 = input.LA(2);

                if ( (LA32_1==28||LA32_1==31||LA32_1==38||LA32_1==44||(LA32_1>=49 && LA32_1<=52)||(LA32_1>=63 && LA32_1<=70)) ) {
                    alt32=1;
                }
            }
            switch (alt32) {
                case 1 :
                    // InternalOCLinEcore.g:1198: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,60,FollowSets000.FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalOCLinEcore.g:1202: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 cnt31=0;
                    loop31:
                    do {
                        int alt31=2;
                        int LA31_0 = input.LA(1);

                        if ( (LA31_0==28||LA31_0==31||LA31_0==38||LA31_0==44||(LA31_0>=49 && LA31_0<=52)||(LA31_0>=63 && LA31_0<=70)) ) {
                            alt31=1;
                        }


                        switch (alt31) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:1202: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= ',' )?
                    	    {
                    	    // InternalOCLinEcore.g:1202: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 alt29=16;
                    	    switch ( input.LA(1) ) {
                    	    case 28:
                    	        {
                    	        alt29=1;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt29=2;
                    	        }
                    	        break;
                    	    case 31:
                    	        {
                    	        alt29=3;
                    	        }
                    	        break;
                    	    case 64:
                    	        {
                    	        alt29=4;
                    	        }
                    	        break;
                    	    case 38:
                    	        {
                    	        alt29=5;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt29=6;
                    	        }
                    	        break;
                    	    case 44:
                    	        {
                    	        alt29=7;
                    	        }
                    	        break;
                    	    case 66:
                    	        {
                    	        alt29=8;
                    	        }
                    	        break;
                    	    case 49:
                    	        {
                    	        alt29=9;
                    	        }
                    	        break;
                    	    case 67:
                    	        {
                    	        alt29=10;
                    	        }
                    	        break;
                    	    case 50:
                    	        {
                    	        alt29=11;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt29=12;
                    	        }
                    	        break;
                    	    case 51:
                    	        {
                    	        alt29=13;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt29=14;
                    	        }
                    	        break;
                    	    case 52:
                    	        {
                    	        alt29=15;
                    	        }
                    	        break;
                    	    case 70:
                    	        {
                    	        alt29=16;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 29, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt29) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1202:3: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1202:3: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            // InternalOCLinEcore.g:1203:1: (lv_qualifiers_11_0= 'derived' )
                    	            {
                    	            // InternalOCLinEcore.g:1203:1: (lv_qualifiers_11_0= 'derived' )
                    	            // InternalOCLinEcore.g:1204:3: lv_qualifiers_11_0= 'derived'
                    	            {
                    	            lv_qualifiers_11_0=(Token)match(input,28,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1218:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1218:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            // InternalOCLinEcore.g:1219:1: (lv_qualifiers_12_0= '!derived' )
                    	            {
                    	            // InternalOCLinEcore.g:1219:1: (lv_qualifiers_12_0= '!derived' )
                    	            // InternalOCLinEcore.g:1220:3: lv_qualifiers_12_0= '!derived'
                    	            {
                    	            lv_qualifiers_12_0=(Token)match(input,63,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1234:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1234:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            // InternalOCLinEcore.g:1235:1: (lv_qualifiers_13_0= 'id' )
                    	            {
                    	            // InternalOCLinEcore.g:1235:1: (lv_qualifiers_13_0= 'id' )
                    	            // InternalOCLinEcore.g:1236:3: lv_qualifiers_13_0= 'id'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,31,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1250:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1250:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            // InternalOCLinEcore.g:1251:1: (lv_qualifiers_14_0= '!id' )
                    	            {
                    	            // InternalOCLinEcore.g:1251:1: (lv_qualifiers_14_0= '!id' )
                    	            // InternalOCLinEcore.g:1252:3: lv_qualifiers_14_0= '!id'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,64,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1266:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1266:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            // InternalOCLinEcore.g:1267:1: (lv_qualifiers_15_0= 'ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:1267:1: (lv_qualifiers_15_0= 'ordered' )
                    	            // InternalOCLinEcore.g:1268:3: lv_qualifiers_15_0= 'ordered'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,38,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1282:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1282:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            // InternalOCLinEcore.g:1283:1: (lv_qualifiers_16_0= '!ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:1283:1: (lv_qualifiers_16_0= '!ordered' )
                    	            // InternalOCLinEcore.g:1284:3: lv_qualifiers_16_0= '!ordered'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,65,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1298:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1298:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            // InternalOCLinEcore.g:1299:1: (lv_qualifiers_17_0= 'readonly' )
                    	            {
                    	            // InternalOCLinEcore.g:1299:1: (lv_qualifiers_17_0= 'readonly' )
                    	            // InternalOCLinEcore.g:1300:3: lv_qualifiers_17_0= 'readonly'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,44,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1314:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1314:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            // InternalOCLinEcore.g:1315:1: (lv_qualifiers_18_0= '!readonly' )
                    	            {
                    	            // InternalOCLinEcore.g:1315:1: (lv_qualifiers_18_0= '!readonly' )
                    	            // InternalOCLinEcore.g:1316:3: lv_qualifiers_18_0= '!readonly'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,66,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1330:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1330:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            // InternalOCLinEcore.g:1331:1: (lv_qualifiers_19_0= 'transient' )
                    	            {
                    	            // InternalOCLinEcore.g:1331:1: (lv_qualifiers_19_0= 'transient' )
                    	            // InternalOCLinEcore.g:1332:3: lv_qualifiers_19_0= 'transient'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,49,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1346:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1346:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            // InternalOCLinEcore.g:1347:1: (lv_qualifiers_20_0= '!transient' )
                    	            {
                    	            // InternalOCLinEcore.g:1347:1: (lv_qualifiers_20_0= '!transient' )
                    	            // InternalOCLinEcore.g:1348:3: lv_qualifiers_20_0= '!transient'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,67,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1362:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1362:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            // InternalOCLinEcore.g:1363:1: (lv_qualifiers_21_0= 'unique' )
                    	            {
                    	            // InternalOCLinEcore.g:1363:1: (lv_qualifiers_21_0= 'unique' )
                    	            // InternalOCLinEcore.g:1364:3: lv_qualifiers_21_0= 'unique'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,50,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1378:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1378:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            // InternalOCLinEcore.g:1379:1: (lv_qualifiers_22_0= '!unique' )
                    	            {
                    	            // InternalOCLinEcore.g:1379:1: (lv_qualifiers_22_0= '!unique' )
                    	            // InternalOCLinEcore.g:1380:3: lv_qualifiers_22_0= '!unique'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,68,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1394:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1394:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            // InternalOCLinEcore.g:1395:1: (lv_qualifiers_23_0= 'unsettable' )
                    	            {
                    	            // InternalOCLinEcore.g:1395:1: (lv_qualifiers_23_0= 'unsettable' )
                    	            // InternalOCLinEcore.g:1396:3: lv_qualifiers_23_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,51,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1410:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1410:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            // InternalOCLinEcore.g:1411:1: (lv_qualifiers_24_0= '!unsettable' )
                    	            {
                    	            // InternalOCLinEcore.g:1411:1: (lv_qualifiers_24_0= '!unsettable' )
                    	            // InternalOCLinEcore.g:1412:3: lv_qualifiers_24_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,69,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1426:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1426:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            // InternalOCLinEcore.g:1427:1: (lv_qualifiers_25_0= 'volatile' )
                    	            {
                    	            // InternalOCLinEcore.g:1427:1: (lv_qualifiers_25_0= 'volatile' )
                    	            // InternalOCLinEcore.g:1428:3: lv_qualifiers_25_0= 'volatile'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,52,FollowSets000.FOLLOW_33); 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 :
                    	            // InternalOCLinEcore.g:1442:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            {
                    	            // InternalOCLinEcore.g:1442:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            // InternalOCLinEcore.g:1443:1: (lv_qualifiers_26_0= '!volatile' )
                    	            {
                    	            // InternalOCLinEcore.g:1443:1: (lv_qualifiers_26_0= '!volatile' )
                    	            // InternalOCLinEcore.g:1444:3: lv_qualifiers_26_0= '!volatile'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,70,FollowSets000.FOLLOW_33); 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;

                    	    }

                    	    // InternalOCLinEcore.g:1457:3: (otherlv_27= ',' )?
                    	    int alt30=2;
                    	    int LA30_0 = input.LA(1);

                    	    if ( (LA30_0==59) ) {
                    	        alt30=1;
                    	    }
                    	    switch (alt30) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1457:5: otherlv_27= ','
                    	            {
                    	            otherlv_27=(Token)match(input,59,FollowSets000.FOLLOW_34); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_27, grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_28, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:1465:3: ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' ) | otherlv_42= ';' )
            int alt38=2;
            int LA38_0 = input.LA(1);

            if ( (LA38_0==60) ) {
                alt38=1;
            }
            else if ( (LA38_0==57) ) {
                alt38=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 38, 0, input);

                throw nvae;
            }
            switch (alt38) {
                case 1 :
                    // InternalOCLinEcore.g:1465:4: (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' )
                    {
                    // InternalOCLinEcore.g:1465:4: (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}' )
                    // InternalOCLinEcore.g:1465:6: otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )* otherlv_41= '}'
                    {
                    otherlv_29=(Token)match(input,60,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_29, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

                    }
                    // InternalOCLinEcore.g:1469:1: ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' ) | (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' ) )*
                    loop37:
                    do {
                        int alt37=4;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt37=1;
                            }
                            break;
                        case 33:
                            {
                            alt37=2;
                            }
                            break;
                        case 27:
                            {
                            alt37=3;
                            }
                            break;

                        }

                        switch (alt37) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:1469:2: ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:1469:2: ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:1470:1: (lv_ownedAnnotations_30_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:1470:1: (lv_ownedAnnotations_30_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:1471:3: lv_ownedAnnotations_30_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_35);
                    	    lv_ownedAnnotations_30_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_30_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:1488:6: (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:1488:6: (otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';' )
                    	    // InternalOCLinEcore.g:1488:8: otherlv_31= 'initial' ( ruleUnrestrictedName )? otherlv_33= ':' ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )? otherlv_35= ';'
                    	    {
                    	    otherlv_31=(Token)match(input,33,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_31, grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:1492:1: ( ruleUnrestrictedName )?
                    	    int alt33=2;
                    	    int LA33_0 = input.LA(1);

                    	    if ( ((LA33_0>=RULE_SIMPLE_ID && LA33_0<=RULE_ESCAPED_ID)||LA33_0==17||(LA33_0>=19 && LA33_0<=53)||LA33_0==58||LA33_0==71||(LA33_0>=73 && LA33_0<=74)||LA33_0==76||LA33_0==80) ) {
                    	        alt33=1;
                    	    }
                    	    switch (alt33) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1493:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());

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

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_33=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_33, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());

                    	    }
                    	    // InternalOCLinEcore.g:1507:1: ( (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS ) )?
                    	    int alt34=2;
                    	    int LA34_0 = input.LA(1);

                    	    if ( ((LA34_0>=RULE_INT && LA34_0<=RULE_SINGLE_QUOTED_STRING)||(LA34_0>=RULE_UNQUOTED_STRING && LA34_0<=RULE_ESCAPED_ID)||(LA34_0>=17 && LA34_0<=54)||LA34_0==58||LA34_0==71||(LA34_0>=73 && LA34_0<=74)||LA34_0==76||LA34_0==80||(LA34_0>=83 && LA34_0<=84)||(LA34_0>=98 && LA34_0<=99)||(LA34_0>=101 && LA34_0<=113)||LA34_0==116||(LA34_0>=118 && LA34_0<=121)||LA34_0==128||(LA34_0>=133 && LA34_0<=134)) ) {
                    	        alt34=1;
                    	    }
                    	    switch (alt34) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1508:1: (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS )
                    	            {
                    	            // InternalOCLinEcore.g:1508:1: (lv_ownedDefaultExpressions_34_0= ruleSpecificationCS )
                    	            // InternalOCLinEcore.g:1509:3: lv_ownedDefaultExpressions_34_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_14);
                    	            lv_ownedDefaultExpressions_34_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_34_0,
                    	                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_35=(Token)match(input,57,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_35, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:1530:6: (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:1530:6: (otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';' )
                    	    // InternalOCLinEcore.g:1530:8: otherlv_36= 'derivation' ( ruleUnrestrictedName )? otherlv_38= ':' ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )? otherlv_40= ';'
                    	    {
                    	    otherlv_36=(Token)match(input,27,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_36, grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:1534:1: ( ruleUnrestrictedName )?
                    	    int alt35=2;
                    	    int LA35_0 = input.LA(1);

                    	    if ( ((LA35_0>=RULE_SIMPLE_ID && LA35_0<=RULE_ESCAPED_ID)||LA35_0==17||(LA35_0>=19 && LA35_0<=53)||LA35_0==58||LA35_0==71||(LA35_0>=73 && LA35_0<=74)||LA35_0==76||LA35_0==80) ) {
                    	        alt35=1;
                    	    }
                    	    switch (alt35) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1535:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_2_1());

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

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_38=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_38, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_2_2());

                    	    }
                    	    // InternalOCLinEcore.g:1549:1: ( (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS ) )?
                    	    int alt36=2;
                    	    int LA36_0 = input.LA(1);

                    	    if ( ((LA36_0>=RULE_INT && LA36_0<=RULE_SINGLE_QUOTED_STRING)||(LA36_0>=RULE_UNQUOTED_STRING && LA36_0<=RULE_ESCAPED_ID)||(LA36_0>=17 && LA36_0<=54)||LA36_0==58||LA36_0==71||(LA36_0>=73 && LA36_0<=74)||LA36_0==76||LA36_0==80||(LA36_0>=83 && LA36_0<=84)||(LA36_0>=98 && LA36_0<=99)||(LA36_0>=101 && LA36_0<=113)||LA36_0==116||(LA36_0>=118 && LA36_0<=121)||LA36_0==128||(LA36_0>=133 && LA36_0<=134)) ) {
                    	        alt36=1;
                    	    }
                    	    switch (alt36) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:1550:1: (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS )
                    	            {
                    	            // InternalOCLinEcore.g:1550:1: (lv_ownedDefaultExpressions_39_0= ruleSpecificationCS )
                    	            // InternalOCLinEcore.g:1551:3: lv_ownedDefaultExpressions_39_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_2_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_14);
                    	            lv_ownedDefaultExpressions_39_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_39_0,
                    	                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_40=(Token)match(input,57,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_40, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_2_4());

                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_41, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:1576:7: otherlv_42= ';'
                    {
                    otherlv_42=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_42, 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"
    // InternalOCLinEcore.g:1588:1: entryRuleClassCS returns [EObject current=null] : iv_ruleClassCS= ruleClassCS EOF ;
    public final EObject entryRuleClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClassCS = null;


        try {
            // InternalOCLinEcore.g:1589:2: (iv_ruleClassCS= ruleClassCS EOF )
            // InternalOCLinEcore.g:1590: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"
    // InternalOCLinEcore.g:1597: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 {
            // InternalOCLinEcore.g:1600:28: ( (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS ) )
            // InternalOCLinEcore.g:1601:1: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            {
            // InternalOCLinEcore.g:1601:1: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            int alt39=3;
            switch ( input.LA(1) ) {
            case 19:
            case 23:
                {
                alt39=1;
                }
                break;
            case 25:
            case 42:
                {
                alt39=2;
                }
                break;
            case 29:
                {
                alt39=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 39, 0, input);

                throw nvae;
            }

            switch (alt39) {
                case 1 :
                    // InternalOCLinEcore.g:1602: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 :
                    // InternalOCLinEcore.g:1615: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 :
                    // InternalOCLinEcore.g:1628: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 "entryRuleDataTypeCS"
    // InternalOCLinEcore.g:1647:1: entryRuleDataTypeCS returns [EObject current=null] : iv_ruleDataTypeCS= ruleDataTypeCS EOF ;
    public final EObject entryRuleDataTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataTypeCS = null;


        try {
            // InternalOCLinEcore.g:1648:2: (iv_ruleDataTypeCS= ruleDataTypeCS EOF )
            // InternalOCLinEcore.g:1649: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"
    // InternalOCLinEcore.g:1656: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= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) ) ;
    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_13=null;
        Token otherlv_14=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedSignature_3_0 = null;

        EObject lv_ownedAnnotations_11_0 = null;

        EObject lv_ownedConstraints_12_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:1659: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= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) ) )
            // InternalOCLinEcore.g:1660: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= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) )
            {
            // InternalOCLinEcore.g:1660: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= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) )
            // InternalOCLinEcore.g:1660: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= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' )
            {
            // InternalOCLinEcore.g:1660:2: ( (lv_isPrimitive_0_0= 'primitive' ) )?
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==42) ) {
                alt40=1;
            }
            switch (alt40) {
                case 1 :
                    // InternalOCLinEcore.g:1661:1: (lv_isPrimitive_0_0= 'primitive' )
                    {
                    // InternalOCLinEcore.g:1661:1: (lv_isPrimitive_0_0= 'primitive' )
                    // InternalOCLinEcore.g:1662:3: lv_isPrimitive_0_0= 'primitive'
                    {
                    lv_isPrimitive_0_0=(Token)match(input,42,FollowSets000.FOLLOW_36); 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,25,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());

            }
            // InternalOCLinEcore.g:1679:1: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:1680:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:1680:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:1681:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_37);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:1697:2: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt41=2;
            int LA41_0 = input.LA(1);

            if ( (LA41_0==54||LA41_0==81) ) {
                alt41=1;
            }
            switch (alt41) {
                case 1 :
                    // InternalOCLinEcore.g:1698:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalOCLinEcore.g:1698:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalOCLinEcore.g:1699:3: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_38);
                    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.oclinecore.OCLinEcore.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:1715:3: (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( (LA42_0==56) ) {
                alt42=1;
            }
            switch (alt42) {
                case 1 :
                    // InternalOCLinEcore.g:1715:5: otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:1719:1: ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:1720:1: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:1720:1: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:1721:3: lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_5_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_22); 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;

            }

            // InternalOCLinEcore.g:1737:4: (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )?
            int alt44=2;
            int LA44_0 = input.LA(1);

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

                if ( ((LA44_1>=71 && LA44_1<=72)) ) {
                    alt44=1;
                }
                else if ( (LA44_1==61) ) {
                    int LA44_4 = input.LA(3);

                    if ( (LA44_4==57||LA44_4==60) ) {
                        alt44=1;
                    }
                }
            }
            switch (alt44) {
                case 1 :
                    // InternalOCLinEcore.g:1737:6: otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}'
                    {
                    otherlv_6=(Token)match(input,60,FollowSets000.FOLLOW_39); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalOCLinEcore.g:1741:1: ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )?
                    int alt43=3;
                    int LA43_0 = input.LA(1);

                    if ( (LA43_0==71) ) {
                        alt43=1;
                    }
                    else if ( (LA43_0==72) ) {
                        alt43=2;
                    }
                    switch (alt43) {
                        case 1 :
                            // InternalOCLinEcore.g:1741:2: ( (lv_isSerializable_7_0= 'serializable' ) )
                            {
                            // InternalOCLinEcore.g:1741:2: ( (lv_isSerializable_7_0= 'serializable' ) )
                            // InternalOCLinEcore.g:1742:1: (lv_isSerializable_7_0= 'serializable' )
                            {
                            // InternalOCLinEcore.g:1742:1: (lv_isSerializable_7_0= 'serializable' )
                            // InternalOCLinEcore.g:1743:3: lv_isSerializable_7_0= 'serializable'
                            {
                            lv_isSerializable_7_0=(Token)match(input,71,FollowSets000.FOLLOW_40); 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 :
                            // InternalOCLinEcore.g:1757:7: otherlv_8= '!serializable'
                            {
                            otherlv_8=(Token)match(input,72,FollowSets000.FOLLOW_40); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_8, grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());

                            }

                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_9, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:1765:3: ( (otherlv_10= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' )
            int alt46=2;
            int LA46_0 = input.LA(1);

            if ( (LA46_0==60) ) {
                alt46=1;
            }
            else if ( (LA46_0==57) ) {
                alt46=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 46, 0, input);

                throw nvae;
            }
            switch (alt46) {
                case 1 :
                    // InternalOCLinEcore.g:1765:4: (otherlv_10= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' )
                    {
                    // InternalOCLinEcore.g:1765:4: (otherlv_10= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' )
                    // InternalOCLinEcore.g:1765:6: otherlv_10= '{' ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}'
                    {
                    otherlv_10=(Token)match(input,60,FollowSets000.FOLLOW_41); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

                    }
                    // InternalOCLinEcore.g:1769:1: ( ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )*
                    loop45:
                    do {
                        int alt45=3;
                        int LA45_0 = input.LA(1);

                        if ( (LA45_0==58||LA45_0==73||LA45_0==80) ) {
                            alt45=1;
                        }
                        else if ( (LA45_0==22||LA45_0==53) ) {
                            alt45=2;
                        }


                        switch (alt45) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:1769:2: ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:1769:2: ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:1770:1: (lv_ownedAnnotations_11_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:1770:1: (lv_ownedAnnotations_11_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:1771:3: lv_ownedAnnotations_11_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_41);
                    	    lv_ownedAnnotations_11_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_11_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:1788:6: ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:1788:6: ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) )
                    	    // InternalOCLinEcore.g:1789:1: (lv_ownedConstraints_12_0= ruleInvariantConstraintCS )
                    	    {
                    	    // InternalOCLinEcore.g:1789:1: (lv_ownedConstraints_12_0= ruleInvariantConstraintCS )
                    	    // InternalOCLinEcore.g:1790:3: lv_ownedConstraints_12_0= ruleInvariantConstraintCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_6_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_41);
                    	    lv_ownedConstraints_12_0=ruleInvariantConstraintCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedConstraints",
                    	              		lv_ownedConstraints_12_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.InvariantConstraintCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_13, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:1811:7: otherlv_14= ';'
                    {
                    otherlv_14=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_14, 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 "entryRuleDetailCS"
    // InternalOCLinEcore.g:1823:1: entryRuleDetailCS returns [EObject current=null] : iv_ruleDetailCS= ruleDetailCS EOF ;
    public final EObject entryRuleDetailCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDetailCS = null;


        try {
            // InternalOCLinEcore.g:1824:2: (iv_ruleDetailCS= ruleDetailCS EOF )
            // InternalOCLinEcore.g:1825:2: iv_ruleDetailCS= ruleDetailCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDetailCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDetailCS=ruleDetailCS();

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

            }

        }

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


    // $ANTLR start "ruleDetailCS"
    // InternalOCLinEcore.g:1832:1: ruleDetailCS returns [EObject current=null] : ( ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) ) otherlv_1= '=' ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )* ) ;
    public final EObject ruleDetailCS() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_2=null;
        Token otherlv_1=null;
        Token lv_values_2_1=null;
        Token lv_values_2_2=null;
        AntlrDatatypeRuleToken lv_name_0_1 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:1835:28: ( ( ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) ) otherlv_1= '=' ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )* ) )
            // InternalOCLinEcore.g:1836:1: ( ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) ) otherlv_1= '=' ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )* )
            {
            // InternalOCLinEcore.g:1836:1: ( ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) ) otherlv_1= '=' ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )* )
            // InternalOCLinEcore.g:1836:2: ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) ) otherlv_1= '=' ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )*
            {
            // InternalOCLinEcore.g:1836:2: ( ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) ) )
            // InternalOCLinEcore.g:1837:1: ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) )
            {
            // InternalOCLinEcore.g:1837:1: ( (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:1838:1: (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:1838:1: (lv_name_0_1= ruleUnrestrictedName | lv_name_0_2= RULE_SINGLE_QUOTED_STRING )
            int alt47=2;
            int LA47_0 = input.LA(1);

            if ( ((LA47_0>=RULE_SIMPLE_ID && LA47_0<=RULE_ESCAPED_ID)||LA47_0==17||(LA47_0>=19 && LA47_0<=53)||LA47_0==58||LA47_0==71||(LA47_0>=73 && LA47_0<=74)||LA47_0==76||LA47_0==80) ) {
                alt47=1;
            }
            else if ( (LA47_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt47=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 47, 0, input);

                throw nvae;
            }
            switch (alt47) {
                case 1 :
                    // InternalOCLinEcore.g:1839:3: lv_name_0_1= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDetailCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_42);
                    lv_name_0_1=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDetailCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_0_1,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:1854:8: lv_name_0_2= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_name_0_2=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_42); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_name_0_2, grammarAccess.getDetailCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_0_0_1());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getDetailCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"name",
                              		lv_name_0_2,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }
                    break;

            }


            }


            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());

            }
            // InternalOCLinEcore.g:1876:1: ( ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) ) )*
            loop49:
            do {
                int alt49=2;
                int LA49_0 = input.LA(1);

                if ( ((LA49_0>=RULE_SINGLE_QUOTED_STRING && LA49_0<=RULE_ML_SINGLE_QUOTED_STRING)) ) {
                    alt49=1;
                }


                switch (alt49) {
            	case 1 :
            	    // InternalOCLinEcore.g:1877:1: ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) )
            	    {
            	    // InternalOCLinEcore.g:1877:1: ( (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING ) )
            	    // InternalOCLinEcore.g:1878:1: (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING )
            	    {
            	    // InternalOCLinEcore.g:1878:1: (lv_values_2_1= RULE_SINGLE_QUOTED_STRING | lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING )
            	    int alt48=2;
            	    int LA48_0 = input.LA(1);

            	    if ( (LA48_0==RULE_SINGLE_QUOTED_STRING) ) {
            	        alt48=1;
            	    }
            	    else if ( (LA48_0==RULE_ML_SINGLE_QUOTED_STRING) ) {
            	        alt48=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 48, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt48) {
            	        case 1 :
            	            // InternalOCLinEcore.g:1879:3: lv_values_2_1= RULE_SINGLE_QUOTED_STRING
            	            {
            	            lv_values_2_1=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_43); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              			newLeafNode(lv_values_2_1, grammarAccess.getDetailCSAccess().getValuesSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_0());

            	            }
            	            if ( state.backtracking==0 ) {

            	              	        if (current==null) {
            	              	            current = createModelElement(grammarAccess.getDetailCSRule());
            	              	        }
            	                     		addWithLastConsumed(
            	                     			current,
            	                     			"values",
            	                      		lv_values_2_1,
            	                      		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalOCLinEcore.g:1894:8: lv_values_2_2= RULE_ML_SINGLE_QUOTED_STRING
            	            {
            	            lv_values_2_2=(Token)match(input,RULE_ML_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_43); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              			newLeafNode(lv_values_2_2, grammarAccess.getDetailCSAccess().getValuesML_SINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());

            	            }
            	            if ( state.backtracking==0 ) {

            	              	        if (current==null) {
            	              	            current = createModelElement(grammarAccess.getDetailCSRule());
            	              	        }
            	                     		addWithLastConsumed(
            	                     			current,
            	                     			"values",
            	                      		lv_values_2_2,
            	                      		"org.eclipse.ocl.xtext.base.Base.ML_SINGLE_QUOTED_STRING");

            	            }

            	            }
            	            break;

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

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

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


    // $ANTLR start "entryRuleDocumentationCS"
    // InternalOCLinEcore.g:1920:1: entryRuleDocumentationCS returns [EObject current=null] : iv_ruleDocumentationCS= ruleDocumentationCS EOF ;
    public final EObject entryRuleDocumentationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDocumentationCS = null;


        try {
            // InternalOCLinEcore.g:1921:2: (iv_ruleDocumentationCS= ruleDocumentationCS EOF )
            // InternalOCLinEcore.g:1922:2: iv_ruleDocumentationCS= ruleDocumentationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDocumentationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDocumentationCS=ruleDocumentationCS();

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

            }

        }

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


    // $ANTLR start "ruleDocumentationCS"
    // InternalOCLinEcore.g:1929:1: ruleDocumentationCS returns [EObject current=null] : ( () otherlv_1= 'documentation' ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? otherlv_8= ';' ) ;
    public final EObject ruleDocumentationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_value_2_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        EObject lv_ownedDetails_4_0 = null;

        EObject lv_ownedDetails_6_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:1932:28: ( ( () otherlv_1= 'documentation' ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? otherlv_8= ';' ) )
            // InternalOCLinEcore.g:1933:1: ( () otherlv_1= 'documentation' ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? otherlv_8= ';' )
            {
            // InternalOCLinEcore.g:1933:1: ( () otherlv_1= 'documentation' ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? otherlv_8= ';' )
            // InternalOCLinEcore.g:1933:2: () otherlv_1= 'documentation' ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )? (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )? otherlv_8= ';'
            {
            // InternalOCLinEcore.g:1933:2: ()
            // InternalOCLinEcore.g:1934:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getDocumentationCSAccess().getDocumentationKeyword_1());

            }
            // InternalOCLinEcore.g:1946:1: ( (lv_value_2_0= RULE_SINGLE_QUOTED_STRING ) )?
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt50=1;
            }
            switch (alt50) {
                case 1 :
                    // InternalOCLinEcore.g:1947:1: (lv_value_2_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:1947:1: (lv_value_2_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:1948:3: lv_value_2_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_value_2_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_45); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_value_2_0, grammarAccess.getDocumentationCSAccess().getValueSINGLE_QUOTED_STRINGTerminalRuleCall_2_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getDocumentationCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"value",
                              		lv_value_2_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:1964:3: (otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')' )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==54) ) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // InternalOCLinEcore.g:1964:5: otherlv_3= '(' ( (lv_ownedDetails_4_0= ruleDetailCS ) ) (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )* otherlv_7= ')'
                    {
                    otherlv_3=(Token)match(input,54,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:1968:1: ( (lv_ownedDetails_4_0= ruleDetailCS ) )
                    // InternalOCLinEcore.g:1969:1: (lv_ownedDetails_4_0= ruleDetailCS )
                    {
                    // InternalOCLinEcore.g:1969:1: (lv_ownedDetails_4_0= ruleDetailCS )
                    // InternalOCLinEcore.g:1970:3: lv_ownedDetails_4_0= ruleDetailCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_21);
                    lv_ownedDetails_4_0=ruleDetailCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getDocumentationCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedDetails",
                              		lv_ownedDetails_4_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:1986:2: (otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) ) )*
                    loop51:
                    do {
                        int alt51=2;
                        int LA51_0 = input.LA(1);

                        if ( (LA51_0==59) ) {
                            alt51=1;
                        }


                        switch (alt51) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:1986:4: otherlv_5= ',' ( (lv_ownedDetails_6_0= ruleDetailCS ) )
                    	    {
                    	    otherlv_5=(Token)match(input,59,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_5, grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:1990:1: ( (lv_ownedDetails_6_0= ruleDetailCS ) )
                    	    // InternalOCLinEcore.g:1991:1: (lv_ownedDetails_6_0= ruleDetailCS )
                    	    {
                    	    // InternalOCLinEcore.g:1991:1: (lv_ownedDetails_6_0= ruleDetailCS )
                    	    // InternalOCLinEcore.g:1992:3: lv_ownedDetails_6_0= ruleDetailCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_21);
                    	    lv_ownedDetails_6_0=ruleDetailCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getDocumentationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedDetails",
                    	              		lv_ownedDetails_6_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_7, grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());

                    }

                    }
                    break;

            }

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

                  	newLeafNode(otherlv_8, grammarAccess.getDocumentationCSAccess().getSemicolonKeyword_4());

            }

            }


            }

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

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


    // $ANTLR start "entryRuleEnumerationCS"
    // InternalOCLinEcore.g:2024:1: entryRuleEnumerationCS returns [EObject current=null] : iv_ruleEnumerationCS= ruleEnumerationCS EOF ;
    public final EObject entryRuleEnumerationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationCS = null;


        try {
            // InternalOCLinEcore.g:2025:2: (iv_ruleEnumerationCS= ruleEnumerationCS EOF )
            // InternalOCLinEcore.g:2026: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"
    // InternalOCLinEcore.g:2033: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_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) ) ;
    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_13=null;
        Token otherlv_14=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedSignature_2_0 = null;

        EObject lv_ownedAnnotations_10_0 = null;

        EObject lv_ownedLiterals_11_0 = null;

        EObject lv_ownedConstraints_12_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2036: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_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) ) )
            // InternalOCLinEcore.g:2037: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_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) )
            {
            // InternalOCLinEcore.g:2037: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_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' ) )
            // InternalOCLinEcore.g:2037: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_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' )
            {
            otherlv_0=(Token)match(input,29,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());

            }
            // InternalOCLinEcore.g:2041:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:2042:1: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:2042:1: (lv_name_1_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:2043:3: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_37);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:2059:2: ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )?
            int alt53=2;
            int LA53_0 = input.LA(1);

            if ( (LA53_0==54||LA53_0==81) ) {
                alt53=1;
            }
            switch (alt53) {
                case 1 :
                    // InternalOCLinEcore.g:2060:1: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    {
                    // InternalOCLinEcore.g:2060:1: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    // InternalOCLinEcore.g:2061:3: lv_ownedSignature_2_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_38);
                    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.oclinecore.OCLinEcore.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2077:3: (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==56) ) {
                alt54=1;
            }
            switch (alt54) {
                case 1 :
                    // InternalOCLinEcore.g:2077:5: otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_3=(Token)match(input,56,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:2081:1: ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:2082:1: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:2082:1: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:2083:3: lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_4_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_22); 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;

            }

            // InternalOCLinEcore.g:2099:4: (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )?
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==60) ) {
                int LA56_1 = input.LA(2);

                if ( ((LA56_1>=71 && LA56_1<=72)) ) {
                    alt56=1;
                }
                else if ( (LA56_1==61) ) {
                    int LA56_4 = input.LA(3);

                    if ( (LA56_4==57||LA56_4==60) ) {
                        alt56=1;
                    }
                }
            }
            switch (alt56) {
                case 1 :
                    // InternalOCLinEcore.g:2099:6: otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}'
                    {
                    otherlv_5=(Token)match(input,60,FollowSets000.FOLLOW_39); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:2103:1: ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )?
                    int alt55=3;
                    int LA55_0 = input.LA(1);

                    if ( (LA55_0==71) ) {
                        alt55=1;
                    }
                    else if ( (LA55_0==72) ) {
                        alt55=2;
                    }
                    switch (alt55) {
                        case 1 :
                            // InternalOCLinEcore.g:2103:2: ( (lv_isSerializable_6_0= 'serializable' ) )
                            {
                            // InternalOCLinEcore.g:2103:2: ( (lv_isSerializable_6_0= 'serializable' ) )
                            // InternalOCLinEcore.g:2104:1: (lv_isSerializable_6_0= 'serializable' )
                            {
                            // InternalOCLinEcore.g:2104:1: (lv_isSerializable_6_0= 'serializable' )
                            // InternalOCLinEcore.g:2105:3: lv_isSerializable_6_0= 'serializable'
                            {
                            lv_isSerializable_6_0=(Token)match(input,71,FollowSets000.FOLLOW_40); 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 :
                            // InternalOCLinEcore.g:2119:7: otherlv_7= '!serializable'
                            {
                            otherlv_7=(Token)match(input,72,FollowSets000.FOLLOW_40); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_7, grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());

                            }

                            }
                            break;

                    }

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

                          	newLeafNode(otherlv_8, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:2127:3: ( (otherlv_9= '{' ( ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' ) | otherlv_14= ';' )
            int alt58=2;
            int LA58_0 = input.LA(1);

            if ( (LA58_0==60) ) {
                alt58=1;
            }
            else if ( (LA58_0==57) ) {
                alt58=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 58, 0, input);

                throw nvae;
            }
            switch (alt58) {
                case 1 :
                    // InternalOCLinEcore.g:2127:4: (otherlv_9= '{' ( ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' )
                    {
                    // InternalOCLinEcore.g:2127:4: (otherlv_9= '{' ( ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}' )
                    // InternalOCLinEcore.g:2127:6: otherlv_9= '{' ( ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )* otherlv_13= '}'
                    {
                    otherlv_9=(Token)match(input,60,FollowSets000.FOLLOW_46); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());

                    }
                    // InternalOCLinEcore.g:2131:1: ( ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) ) | ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) ) | ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) ) )*
                    loop57:
                    do {
                        int alt57=4;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt57=1;
                            }
                            break;
                        case RULE_SIMPLE_ID:
                        case RULE_ESCAPED_ID:
                        case 17:
                        case 19:
                        case 20:
                        case 21:
                        case 23:
                        case 24:
                        case 25:
                        case 26:
                        case 27:
                        case 28:
                        case 29:
                        case 30:
                        case 31:
                        case 32:
                        case 33:
                        case 34:
                        case 35:
                        case 36:
                        case 37:
                        case 38:
                        case 39:
                        case 40:
                        case 41:
                        case 42:
                        case 43:
                        case 44:
                        case 45:
                        case 46:
                        case 47:
                        case 48:
                        case 49:
                        case 50:
                        case 51:
                        case 52:
                        case 74:
                            {
                            alt57=2;
                            }
                            break;
                        case 22:
                            {
                            int LA57_4 = input.LA(2);

                            if ( (LA57_4==53) ) {
                                alt57=3;
                            }
                            else if ( ((LA57_4>=56 && LA57_4<=57)||LA57_4==60||LA57_4==62) ) {
                                alt57=2;
                            }


                            }
                            break;
                        case 53:
                            {
                            alt57=3;
                            }
                            break;

                        }

                        switch (alt57) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2131:2: ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:2131:2: ( (lv_ownedAnnotations_10_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:2132:1: (lv_ownedAnnotations_10_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:2132:1: (lv_ownedAnnotations_10_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:2133:3: lv_ownedAnnotations_10_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_5_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedAnnotations_10_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_10_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:2150:6: ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:2150:6: ( (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS ) )
                    	    // InternalOCLinEcore.g:2151:1: (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS )
                    	    {
                    	    // InternalOCLinEcore.g:2151:1: (lv_ownedLiterals_11_0= ruleEnumerationLiteralCS )
                    	    // InternalOCLinEcore.g:2152:3: lv_ownedLiterals_11_0= ruleEnumerationLiteralCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedLiterals_11_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_11_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.EnumerationLiteralCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:2169:6: ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:2169:6: ( (lv_ownedConstraints_12_0= ruleInvariantConstraintCS ) )
                    	    // InternalOCLinEcore.g:2170:1: (lv_ownedConstraints_12_0= ruleInvariantConstraintCS )
                    	    {
                    	    // InternalOCLinEcore.g:2170:1: (lv_ownedConstraints_12_0= ruleInvariantConstraintCS )
                    	    // InternalOCLinEcore.g:2171:3: lv_ownedConstraints_12_0= ruleInvariantConstraintCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_5_0_1_2_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedConstraints_12_0=ruleInvariantConstraintCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedConstraints",
                    	              		lv_ownedConstraints_12_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.InvariantConstraintCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_13, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:2192:7: otherlv_14= ';'
                    {
                    otherlv_14=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_14, 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"
    // InternalOCLinEcore.g:2204:1: entryRuleEnumerationLiteralCS returns [EObject current=null] : iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF ;
    public final EObject entryRuleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationLiteralCS = null;


        try {
            // InternalOCLinEcore.g:2205:2: (iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF )
            // InternalOCLinEcore.g:2206: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"
    // InternalOCLinEcore.g:2213:1: ruleEnumerationLiteralCS returns [EObject current=null] : ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )? ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' ) ) ;
    public final EObject ruleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token lv_literal_4_0=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_value_6_0 = null;

        EObject lv_ownedAnnotations_8_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2216:28: ( ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )? ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' ) ) )
            // InternalOCLinEcore.g:2217:1: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )? ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' ) )
            {
            // InternalOCLinEcore.g:2217:1: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )? ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' ) )
            // InternalOCLinEcore.g:2217:2: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )? ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' )
            {
            // InternalOCLinEcore.g:2217:2: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) )
            int alt59=2;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==74) ) {
                alt59=1;
            }
            else if ( ((LA59_0>=RULE_SIMPLE_ID && LA59_0<=RULE_ESCAPED_ID)||LA59_0==17||(LA59_0>=19 && LA59_0<=52)) ) {
                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 :
                    // InternalOCLinEcore.g:2217:3: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    {
                    // InternalOCLinEcore.g:2217:3: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    // InternalOCLinEcore.g:2217:5: otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) )
                    {
                    otherlv_0=(Token)match(input,74,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());

                    }
                    // InternalOCLinEcore.g:2221:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:2222:1: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:2222:1: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:2223:3: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:2240:6: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    {
                    // InternalOCLinEcore.g:2240:6: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    // InternalOCLinEcore.g:2241:1: (lv_name_2_0= ruleEnumerationLiteralName )
                    {
                    // InternalOCLinEcore.g:2241:1: (lv_name_2_0= ruleEnumerationLiteralName )
                    // InternalOCLinEcore.g:2242:3: lv_name_2_0= ruleEnumerationLiteralName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    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.ocl.xtext.oclinecore.OCLinEcore.EnumerationLiteralName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2258:3: (otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt60=2;
            int LA60_0 = input.LA(1);

            if ( (LA60_0==56) ) {
                alt60=1;
            }
            switch (alt60) {
                case 1 :
                    // InternalOCLinEcore.g:2258:5: otherlv_3= ':' ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_3=(Token)match(input,56,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getEnumerationLiteralCSAccess().getColonKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:2262:1: ( (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:2263:1: (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:2263:1: (lv_literal_4_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:2264:3: lv_literal_4_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_literal_4_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_30); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_literal_4_0, grammarAccess.getEnumerationLiteralCSAccess().getLiteralSINGLE_QUOTED_STRINGTerminalRuleCall_1_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getEnumerationLiteralCSRule());
                      	        }
                             		setWithLastConsumed(
                             			current,
                             			"literal",
                              		lv_literal_4_0,
                              		"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2280:4: (otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) ) )?
            int alt61=2;
            int LA61_0 = input.LA(1);

            if ( (LA61_0==62) ) {
                alt61=1;
            }
            switch (alt61) {
                case 1 :
                    // InternalOCLinEcore.g:2280:6: otherlv_5= '=' ( (lv_value_6_0= ruleSIGNED ) )
                    {
                    otherlv_5=(Token)match(input,62,FollowSets000.FOLLOW_47); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_2_0());

                    }
                    // InternalOCLinEcore.g:2284:1: ( (lv_value_6_0= ruleSIGNED ) )
                    // InternalOCLinEcore.g:2285:1: (lv_value_6_0= ruleSIGNED )
                    {
                    // InternalOCLinEcore.g:2285:1: (lv_value_6_0= ruleSIGNED )
                    // InternalOCLinEcore.g:2286:3: lv_value_6_0= ruleSIGNED
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_22);
                    lv_value_6_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_6_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SIGNED");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2302:4: ( (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' ) | otherlv_10= ';' )
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( (LA63_0==60) ) {
                alt63=1;
            }
            else if ( (LA63_0==57) ) {
                alt63=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;
            }
            switch (alt63) {
                case 1 :
                    // InternalOCLinEcore.g:2302:5: (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' )
                    {
                    // InternalOCLinEcore.g:2302:5: (otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}' )
                    // InternalOCLinEcore.g:2302:7: otherlv_7= '{' ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )* otherlv_9= '}'
                    {
                    otherlv_7=(Token)match(input,60,FollowSets000.FOLLOW_48); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_3_0_0());

                    }
                    // InternalOCLinEcore.g:2306:1: ( (lv_ownedAnnotations_8_0= ruleAnnotationElementCS ) )*
                    loop62:
                    do {
                        int alt62=2;
                        int LA62_0 = input.LA(1);

                        if ( (LA62_0==58||LA62_0==73||LA62_0==80) ) {
                            alt62=1;
                        }


                        switch (alt62) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2307:1: (lv_ownedAnnotations_8_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:2307:1: (lv_ownedAnnotations_8_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:2308:3: lv_ownedAnnotations_8_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_0_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_48);
                    	    lv_ownedAnnotations_8_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_8_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_9, grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_3_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:2329:7: otherlv_10= ';'
                    {
                    otherlv_10=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_3_1());

                    }

                    }
                    break;

            }


            }


            }

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

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


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

        EObject iv_ruleImportCS = null;


        try {
            // InternalOCLinEcore.g:2342:2: (iv_ruleImportCS= ruleImportCS EOF )
            // InternalOCLinEcore.g:2343: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"
    // InternalOCLinEcore.g:2350:1: ruleImportCS returns [EObject current=null] : ( (otherlv_0= 'import' | otherlv_1= 'library' ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )? ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) ) ( (lv_isAll_5_0= '::*' ) )? otherlv_6= ';' ) ;
    public final EObject ruleImportCS() throws RecognitionException {
        EObject current = null;

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

        EObject lv_ownedPathName_4_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2353:28: ( ( (otherlv_0= 'import' | otherlv_1= 'library' ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )? ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) ) ( (lv_isAll_5_0= '::*' ) )? otherlv_6= ';' ) )
            // InternalOCLinEcore.g:2354:1: ( (otherlv_0= 'import' | otherlv_1= 'library' ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )? ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) ) ( (lv_isAll_5_0= '::*' ) )? otherlv_6= ';' )
            {
            // InternalOCLinEcore.g:2354:1: ( (otherlv_0= 'import' | otherlv_1= 'library' ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )? ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) ) ( (lv_isAll_5_0= '::*' ) )? otherlv_6= ';' )
            // InternalOCLinEcore.g:2354:2: (otherlv_0= 'import' | otherlv_1= 'library' ) ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )? ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) ) ( (lv_isAll_5_0= '::*' ) )? otherlv_6= ';'
            {
            // InternalOCLinEcore.g:2354:2: (otherlv_0= 'import' | otherlv_1= 'library' )
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==32) ) {
                alt64=1;
            }
            else if ( (LA64_0==36) ) {
                alt64=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 64, 0, input);

                throw nvae;
            }
            switch (alt64) {
                case 1 :
                    // InternalOCLinEcore.g:2354:4: otherlv_0= 'import'
                    {
                    otherlv_0=(Token)match(input,32,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:2359:7: otherlv_1= 'library'
                    {
                    otherlv_1=(Token)match(input,36,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getImportCSAccess().getLibraryKeyword_0_1());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:2363:2: ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )?
            int alt65=2;
            alt65 = dfa65.predict(input);
            switch (alt65) {
                case 1 :
                    // InternalOCLinEcore.g:2363:3: ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':'
                    {
                    // InternalOCLinEcore.g:2363:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:2364:1: (lv_name_2_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:2364:1: (lv_name_2_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:2365:3: lv_name_2_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getImportCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());

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

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getImportCSRule());
                      	        }
                             		set(
                             			current,
                             			"name",
                              		lv_name_2_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

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

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:2385:3: ( (lv_ownedPathName_4_0= ruleURIPathNameCS ) )
            // InternalOCLinEcore.g:2386:1: (lv_ownedPathName_4_0= ruleURIPathNameCS )
            {
            // InternalOCLinEcore.g:2386:1: (lv_ownedPathName_4_0= ruleURIPathNameCS )
            // InternalOCLinEcore.g:2387:3: lv_ownedPathName_4_0= ruleURIPathNameCS
            {
            if ( state.backtracking==0 ) {

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

            }
            pushFollow(FollowSets000.FOLLOW_49);
            lv_ownedPathName_4_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_4_0,
                      		"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.URIPathNameCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:2403:2: ( (lv_isAll_5_0= '::*' ) )?
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( (LA66_0==75) ) {
                alt66=1;
            }
            switch (alt66) {
                case 1 :
                    // InternalOCLinEcore.g:2404:1: (lv_isAll_5_0= '::*' )
                    {
                    // InternalOCLinEcore.g:2404:1: (lv_isAll_5_0= '::*' )
                    // InternalOCLinEcore.g:2405:3: lv_isAll_5_0= '::*'
                    {
                    lv_isAll_5_0=(Token)match(input,75,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              newLeafNode(lv_isAll_5_0, grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());

                    }
                    if ( state.backtracking==0 ) {

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

                    }

                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,57,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 "entryRuleModelElementCS"
    // InternalOCLinEcore.g:2430:1: entryRuleModelElementCS returns [EObject current=null] : iv_ruleModelElementCS= ruleModelElementCS EOF ;
    public final EObject entryRuleModelElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleModelElementCS = null;


        try {
            // InternalOCLinEcore.g:2431:2: (iv_ruleModelElementCS= ruleModelElementCS EOF )
            // InternalOCLinEcore.g:2432:2: iv_ruleModelElementCS= ruleModelElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getModelElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleModelElementCS=ruleModelElementCS();

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

            }

        }

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


    // $ANTLR start "ruleModelElementCS"
    // InternalOCLinEcore.g:2439:1: ruleModelElementCS returns [EObject current=null] : (this_ClassCS_0= ruleClassCS | this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS | this_OperationCS_2= ruleOperationCS | this_PackageCS_3= rulePackageCS | this_StructuralFeatureCS_4= ruleStructuralFeatureCS ) ;
    public final EObject ruleModelElementCS() throws RecognitionException {
        EObject current = null;

        EObject this_ClassCS_0 = null;

        EObject this_EnumerationLiteralCS_1 = null;

        EObject this_OperationCS_2 = null;

        EObject this_PackageCS_3 = null;

        EObject this_StructuralFeatureCS_4 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2442:28: ( (this_ClassCS_0= ruleClassCS | this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS | this_OperationCS_2= ruleOperationCS | this_PackageCS_3= rulePackageCS | this_StructuralFeatureCS_4= ruleStructuralFeatureCS ) )
            // InternalOCLinEcore.g:2443:1: (this_ClassCS_0= ruleClassCS | this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS | this_OperationCS_2= ruleOperationCS | this_PackageCS_3= rulePackageCS | this_StructuralFeatureCS_4= ruleStructuralFeatureCS )
            {
            // InternalOCLinEcore.g:2443:1: (this_ClassCS_0= ruleClassCS | this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS | this_OperationCS_2= ruleOperationCS | this_PackageCS_3= rulePackageCS | this_StructuralFeatureCS_4= ruleStructuralFeatureCS )
            int alt67=5;
            alt67 = dfa67.predict(input);
            switch (alt67) {
                case 1 :
                    // InternalOCLinEcore.g:2444:2: this_ClassCS_0= ruleClassCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getModelElementCSAccess().getClassCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ClassCS_0=ruleClassCS();

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

                              current = this_ClassCS_0;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:2457:2: this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getModelElementCSAccess().getEnumerationLiteralCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnumerationLiteralCS_1=ruleEnumerationLiteralCS();

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

                              current = this_EnumerationLiteralCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:2470:2: this_OperationCS_2= ruleOperationCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getModelElementCSAccess().getOperationCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_OperationCS_2=ruleOperationCS();

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

                              current = this_OperationCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:2483:2: this_PackageCS_3= rulePackageCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getModelElementCSAccess().getPackageCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PackageCS_3=rulePackageCS();

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

                              current = this_PackageCS_3;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:2496:2: this_StructuralFeatureCS_4= ruleStructuralFeatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getModelElementCSAccess().getStructuralFeatureCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StructuralFeatureCS_4=ruleStructuralFeatureCS();

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

                              current = this_StructuralFeatureCS_4;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleModelElementRefCS"
    // InternalOCLinEcore.g:2515:1: entryRuleModelElementRefCS returns [EObject current=null] : iv_ruleModelElementRefCS= ruleModelElementRefCS EOF ;
    public final EObject entryRuleModelElementRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleModelElementRefCS = null;


        try {
            // InternalOCLinEcore.g:2516:2: (iv_ruleModelElementRefCS= ruleModelElementRefCS EOF )
            // InternalOCLinEcore.g:2517:2: iv_ruleModelElementRefCS= ruleModelElementRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getModelElementRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleModelElementRefCS=ruleModelElementRefCS();

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

            }

        }

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


    // $ANTLR start "ruleModelElementRefCS"
    // InternalOCLinEcore.g:2524:1: ruleModelElementRefCS returns [EObject current=null] : (otherlv_0= 'reference' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ';' ) ;
    public final EObject ruleModelElementRefCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_ownedPathName_1_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2527:28: ( (otherlv_0= 'reference' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ';' ) )
            // InternalOCLinEcore.g:2528:1: (otherlv_0= 'reference' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ';' )
            {
            // InternalOCLinEcore.g:2528:1: (otherlv_0= 'reference' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ';' )
            // InternalOCLinEcore.g:2528:3: otherlv_0= 'reference' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ';'
            {
            otherlv_0=(Token)match(input,45,FollowSets000.FOLLOW_29); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getModelElementRefCSAccess().getReferenceKeyword_0());

            }
            // InternalOCLinEcore.g:2532:1: ( (lv_ownedPathName_1_0= rulePathNameCS ) )
            // InternalOCLinEcore.g:2533:1: (lv_ownedPathName_1_0= rulePathNameCS )
            {
            // InternalOCLinEcore.g:2533:1: (lv_ownedPathName_1_0= rulePathNameCS )
            // InternalOCLinEcore.g:2534:3: lv_ownedPathName_1_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getModelElementRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_14);
            lv_ownedPathName_1_0=rulePathNameCS();

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

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

            }

            }


            }

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

                  	newLeafNode(otherlv_2, grammarAccess.getModelElementRefCSAccess().getSemicolonKeyword_2());

            }

            }


            }

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

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


    // $ANTLR start "entryRuleOperationCS"
    // InternalOCLinEcore.g:2562:1: entryRuleOperationCS returns [EObject current=null] : iv_ruleOperationCS= ruleOperationCS EOF ;
    public final EObject entryRuleOperationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOperationCS = null;


        try {
            // InternalOCLinEcore.g:2563:2: (iv_ruleOperationCS= ruleOperationCS EOF )
            // InternalOCLinEcore.g:2564: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"
    // InternalOCLinEcore.g:2571: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' ) ) ;
    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 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_32=null;
        Token otherlv_34=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token otherlv_39=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_ownedAnnotations_30_0 = null;

        EObject lv_ownedPreconditions_31_0 = null;

        EObject lv_ownedBodyExpressions_35_0 = null;

        EObject lv_ownedPostconditions_37_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:2574: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' ) ) )
            // InternalOCLinEcore.g:2575: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' ) )
            {
            // InternalOCLinEcore.g:2575: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' ) )
            // InternalOCLinEcore.g:2575: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' )
            {
            // InternalOCLinEcore.g:2575:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt70=3;
            int LA70_0 = input.LA(1);

            if ( (LA70_0==47) ) {
                alt70=1;
            }
            else if ( (LA70_0==26) ) {
                alt70=2;
            }
            switch (alt70) {
                case 1 :
                    // InternalOCLinEcore.g:2575:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalOCLinEcore.g:2575:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalOCLinEcore.g:2575:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalOCLinEcore.g:2575:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalOCLinEcore.g:2576:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalOCLinEcore.g:2576:1: (lv_qualifiers_0_0= 'static' )
                    // InternalOCLinEcore.g:2577:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,47,FollowSets000.FOLLOW_50); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:2590:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt68=2;
                    int LA68_0 = input.LA(1);

                    if ( (LA68_0==26) ) {
                        alt68=1;
                    }
                    switch (alt68) {
                        case 1 :
                            // InternalOCLinEcore.g:2591:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalOCLinEcore.g:2591:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalOCLinEcore.g:2592:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,26,FollowSets000.FOLLOW_51); 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 :
                    // InternalOCLinEcore.g:2606:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalOCLinEcore.g:2606:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalOCLinEcore.g:2606:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalOCLinEcore.g:2606:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalOCLinEcore.g:2607:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalOCLinEcore.g:2607:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalOCLinEcore.g:2608:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,26,FollowSets000.FOLLOW_52); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:2621:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt69=2;
                    int LA69_0 = input.LA(1);

                    if ( (LA69_0==47) ) {
                        alt69=1;
                    }
                    switch (alt69) {
                        case 1 :
                            // InternalOCLinEcore.g:2622:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalOCLinEcore.g:2622:1: (lv_qualifiers_3_0= 'static' )
                            // InternalOCLinEcore.g:2623:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,47,FollowSets000.FOLLOW_51); 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,37,FollowSets000.FOLLOW_53); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getOperationCSAccess().getOperationKeyword_1());

            }
            // InternalOCLinEcore.g:2640:1: ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )?
            int alt71=2;
            int LA71_0 = input.LA(1);

            if ( (LA71_0==54||LA71_0==81) ) {
                alt71=1;
            }
            switch (alt71) {
                case 1 :
                    // InternalOCLinEcore.g:2641:1: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    {
                    // InternalOCLinEcore.g:2641:1: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    // InternalOCLinEcore.g:2642:3: lv_ownedSignature_5_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_3);
                    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.oclinecore.OCLinEcore.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2658:3: ( (lv_name_6_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:2659:1: (lv_name_6_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:2659:1: (lv_name_6_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:2660: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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

                  	newLeafNode(otherlv_7, grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());

            }
            // InternalOCLinEcore.g:2680:1: ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )?
            int alt73=2;
            int LA73_0 = input.LA(1);

            if ( ((LA73_0>=RULE_SIMPLE_ID && LA73_0<=RULE_ESCAPED_ID)||LA73_0==17||(LA73_0>=19 && LA73_0<=53)||LA73_0==58||LA73_0==71||(LA73_0>=73 && LA73_0<=74)||LA73_0==76||LA73_0==80) ) {
                alt73=1;
            }
            switch (alt73) {
                case 1 :
                    // InternalOCLinEcore.g:2680:2: ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    {
                    // InternalOCLinEcore.g:2680:2: ( (lv_ownedParameters_8_0= ruleParameterCS ) )
                    // InternalOCLinEcore.g:2681:1: (lv_ownedParameters_8_0= ruleParameterCS )
                    {
                    // InternalOCLinEcore.g:2681:1: (lv_ownedParameters_8_0= ruleParameterCS )
                    // InternalOCLinEcore.g:2682:3: lv_ownedParameters_8_0= ruleParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_21);
                    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.ocl.xtext.oclinecore.OCLinEcore.ParameterCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:2698:2: (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    loop72:
                    do {
                        int alt72=2;
                        int LA72_0 = input.LA(1);

                        if ( (LA72_0==59) ) {
                            alt72=1;
                        }


                        switch (alt72) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2698:4: otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    {
                    	    otherlv_9=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_9, grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:2702:1: ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    // InternalOCLinEcore.g:2703:1: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    {
                    	    // InternalOCLinEcore.g:2703:1: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    // InternalOCLinEcore.g:2704:3: lv_ownedParameters_10_0= ruleParameterCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_21);
                    	    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.ocl.xtext.oclinecore.OCLinEcore.ParameterCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

                  	newLeafNode(otherlv_11, grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());

            }
            // InternalOCLinEcore.g:2724:1: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( (LA74_0==56) ) {
                alt74=1;
            }
            switch (alt74) {
                case 1 :
                    // InternalOCLinEcore.g:2724:3: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_12=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getOperationCSAccess().getColonKeyword_7_0());

                    }
                    // InternalOCLinEcore.g:2728:1: ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    // InternalOCLinEcore.g:2729:1: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalOCLinEcore.g:2729:1: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    // InternalOCLinEcore.g:2730:3: lv_ownedType_13_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:2746:4: (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )?
            int alt76=2;
            int LA76_0 = input.LA(1);

            if ( (LA76_0==48) ) {
                alt76=1;
            }
            switch (alt76) {
                case 1 :
                    // InternalOCLinEcore.g:2746:6: otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_14=(Token)match(input,48,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_14, grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());

                    }
                    // InternalOCLinEcore.g:2750:1: ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) )
                    // InternalOCLinEcore.g:2751:1: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:2751:1: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    // InternalOCLinEcore.g:2752:3: lv_ownedExceptions_15_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:2768:2: (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    loop75:
                    do {
                        int alt75=2;
                        int LA75_0 = input.LA(1);

                        if ( (LA75_0==59) ) {
                            alt75=1;
                        }


                        switch (alt75) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2768:4: otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_16=(Token)match(input,59,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_16, grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:2772:1: ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    // InternalOCLinEcore.g:2773:1: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    {
                    	    // InternalOCLinEcore.g:2773:1: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    // InternalOCLinEcore.g:2774:3: lv_ownedExceptions_17_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_58);
                    	    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalOCLinEcore.g:2790: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==60) ) {
                int LA80_1 = input.LA(2);

                if ( (LA80_1==28||LA80_1==38||(LA80_1>=49 && LA80_1<=50)||LA80_1==63||LA80_1==65||(LA80_1>=67 && LA80_1<=68)) ) {
                    alt80=1;
                }
            }
            switch (alt80) {
                case 1 :
                    // InternalOCLinEcore.g:2790: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}'
                    {
                    otherlv_18=(Token)match(input,60,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_18, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());

                    }
                    // InternalOCLinEcore.g:2794: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )? )+
                    int cnt79=0;
                    loop79:
                    do {
                        int alt79=2;
                        int LA79_0 = input.LA(1);

                        if ( (LA79_0==28||LA79_0==38||(LA79_0>=49 && LA79_0<=50)||LA79_0==63||LA79_0==65||(LA79_0>=67 && LA79_0<=68)) ) {
                            alt79=1;
                        }


                        switch (alt79) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2794: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) ) (otherlv_27= ',' )?
                    	    {
                    	    // InternalOCLinEcore.g:2794: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= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) )
                    	    int alt77=8;
                    	    switch ( input.LA(1) ) {
                    	    case 28:
                    	        {
                    	        alt77=1;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt77=2;
                    	        }
                    	        break;
                    	    case 38:
                    	        {
                    	        alt77=3;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt77=4;
                    	        }
                    	        break;
                    	    case 49:
                    	        {
                    	        alt77=5;
                    	        }
                    	        break;
                    	    case 67:
                    	        {
                    	        alt77=6;
                    	        }
                    	        break;
                    	    case 50:
                    	        {
                    	        alt77=7;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt77=8;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 77, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt77) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:2794:3: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2794:3: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            // InternalOCLinEcore.g:2795:1: (lv_qualifiers_19_0= 'derived' )
                    	            {
                    	            // InternalOCLinEcore.g:2795:1: (lv_qualifiers_19_0= 'derived' )
                    	            // InternalOCLinEcore.g:2796:3: lv_qualifiers_19_0= 'derived'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,28,FollowSets000.FOLLOW_60); 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 :
                    	            // InternalOCLinEcore.g:2810:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2810:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            // InternalOCLinEcore.g:2811:1: (lv_qualifiers_20_0= '!derived' )
                    	            {
                    	            // InternalOCLinEcore.g:2811:1: (lv_qualifiers_20_0= '!derived' )
                    	            // InternalOCLinEcore.g:2812:3: lv_qualifiers_20_0= '!derived'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,63,FollowSets000.FOLLOW_60); 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 :
                    	            // InternalOCLinEcore.g:2826:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2826:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            // InternalOCLinEcore.g:2827:1: (lv_qualifiers_21_0= 'ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:2827:1: (lv_qualifiers_21_0= 'ordered' )
                    	            // InternalOCLinEcore.g:2828:3: lv_qualifiers_21_0= 'ordered'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,38,FollowSets000.FOLLOW_60); 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 :
                    	            // InternalOCLinEcore.g:2842:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2842:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            // InternalOCLinEcore.g:2843:1: (lv_qualifiers_22_0= '!ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:2843:1: (lv_qualifiers_22_0= '!ordered' )
                    	            // InternalOCLinEcore.g:2844:3: lv_qualifiers_22_0= '!ordered'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,65,FollowSets000.FOLLOW_60); 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 :
                    	            // InternalOCLinEcore.g:2858:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2858:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            // InternalOCLinEcore.g:2859:1: (lv_qualifiers_23_0= 'transient' )
                    	            {
                    	            // InternalOCLinEcore.g:2859:1: (lv_qualifiers_23_0= 'transient' )
                    	            // InternalOCLinEcore.g:2860:3: lv_qualifiers_23_0= 'transient'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,49,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_23_0, grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalOCLinEcore.g:2874:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2874:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            // InternalOCLinEcore.g:2875:1: (lv_qualifiers_24_0= '!transient' )
                    	            {
                    	            // InternalOCLinEcore.g:2875:1: (lv_qualifiers_24_0= '!transient' )
                    	            // InternalOCLinEcore.g:2876:3: lv_qualifiers_24_0= '!transient'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,67,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_24_0, grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 7 :
                    	            // InternalOCLinEcore.g:2890:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2890:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            // InternalOCLinEcore.g:2891:1: (lv_qualifiers_25_0= 'unique' )
                    	            {
                    	            // InternalOCLinEcore.g:2891:1: (lv_qualifiers_25_0= 'unique' )
                    	            // InternalOCLinEcore.g:2892:3: lv_qualifiers_25_0= 'unique'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,50,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_25_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_25_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 8 :
                    	            // InternalOCLinEcore.g:2906:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:2906:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            // InternalOCLinEcore.g:2907:1: (lv_qualifiers_26_0= '!unique' )
                    	            {
                    	            // InternalOCLinEcore.g:2907:1: (lv_qualifiers_26_0= '!unique' )
                    	            // InternalOCLinEcore.g:2908:3: lv_qualifiers_26_0= '!unique'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,68,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_26_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getOperationCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_26_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalOCLinEcore.g:2921:3: (otherlv_27= ',' )?
                    	    int alt78=2;
                    	    int LA78_0 = input.LA(1);

                    	    if ( (LA78_0==59) ) {
                    	        alt78=1;
                    	    }
                    	    switch (alt78) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:2921:5: otherlv_27= ','
                    	            {
                    	            otherlv_27=(Token)match(input,59,FollowSets000.FOLLOW_61); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_27, grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_28, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:2929:3: ( (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' ) | otherlv_39= ';' )
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( (LA84_0==60) ) {
                alt84=1;
            }
            else if ( (LA84_0==57) ) {
                alt84=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 84, 0, input);

                throw nvae;
            }
            switch (alt84) {
                case 1 :
                    // InternalOCLinEcore.g:2929:4: (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' )
                    {
                    // InternalOCLinEcore.g:2929:4: (otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}' )
                    // InternalOCLinEcore.g:2929:6: otherlv_29= '{' ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )* otherlv_38= '}'
                    {
                    otherlv_29=(Token)match(input,60,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_29, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());

                    }
                    // InternalOCLinEcore.g:2933:1: ( ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) ) | (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' ) | ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) ) )*
                    loop83:
                    do {
                        int alt83=5;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt83=1;
                            }
                            break;
                        case 41:
                            {
                            alt83=2;
                            }
                            break;
                        case 21:
                            {
                            alt83=3;
                            }
                            break;
                        case 40:
                            {
                            alt83=4;
                            }
                            break;

                        }

                        switch (alt83) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:2933:2: ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:2933:2: ( (lv_ownedAnnotations_30_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:2934:1: (lv_ownedAnnotations_30_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:2934:1: (lv_ownedAnnotations_30_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:2935:3: lv_ownedAnnotations_30_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_10_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_62);
                    	    lv_ownedAnnotations_30_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_30_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:2952:6: ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:2952:6: ( (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS ) )
                    	    // InternalOCLinEcore.g:2953:1: (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS )
                    	    {
                    	    // InternalOCLinEcore.g:2953:1: (lv_ownedPreconditions_31_0= rulePreconditionConstraintCS )
                    	    // InternalOCLinEcore.g:2954:3: lv_ownedPreconditions_31_0= rulePreconditionConstraintCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedPreconditionsPreconditionConstraintCSParserRuleCall_10_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_62);
                    	    lv_ownedPreconditions_31_0=rulePreconditionConstraintCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedPreconditions",
                    	              		lv_ownedPreconditions_31_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.PreconditionConstraintCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:2971:6: (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:2971:6: (otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';' )
                    	    // InternalOCLinEcore.g:2971:8: otherlv_32= 'body' ( ruleUnrestrictedName )? otherlv_34= ':' ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )? otherlv_36= ';'
                    	    {
                    	    otherlv_32=(Token)match(input,21,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_32, grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:2975:1: ( ruleUnrestrictedName )?
                    	    int alt81=2;
                    	    int LA81_0 = input.LA(1);

                    	    if ( ((LA81_0>=RULE_SIMPLE_ID && LA81_0<=RULE_ESCAPED_ID)||LA81_0==17||(LA81_0>=19 && LA81_0<=53)||LA81_0==58||LA81_0==71||(LA81_0>=73 && LA81_0<=74)||LA81_0==76||LA81_0==80) ) {
                    	        alt81=1;
                    	    }
                    	    switch (alt81) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:2976:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_2_1());

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

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_34=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_34, grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2_2());

                    	    }
                    	    // InternalOCLinEcore.g:2990:1: ( (lv_ownedBodyExpressions_35_0= ruleSpecificationCS ) )?
                    	    int alt82=2;
                    	    int LA82_0 = input.LA(1);

                    	    if ( ((LA82_0>=RULE_INT && LA82_0<=RULE_SINGLE_QUOTED_STRING)||(LA82_0>=RULE_UNQUOTED_STRING && LA82_0<=RULE_ESCAPED_ID)||(LA82_0>=17 && LA82_0<=54)||LA82_0==58||LA82_0==71||(LA82_0>=73 && LA82_0<=74)||LA82_0==76||LA82_0==80||(LA82_0>=83 && LA82_0<=84)||(LA82_0>=98 && LA82_0<=99)||(LA82_0>=101 && LA82_0<=113)||LA82_0==116||(LA82_0>=118 && LA82_0<=121)||LA82_0==128||(LA82_0>=133 && LA82_0<=134)) ) {
                    	        alt82=1;
                    	    }
                    	    switch (alt82) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:2991:1: (lv_ownedBodyExpressions_35_0= ruleSpecificationCS )
                    	            {
                    	            // InternalOCLinEcore.g:2991:1: (lv_ownedBodyExpressions_35_0= ruleSpecificationCS )
                    	            // InternalOCLinEcore.g:2992:3: lv_ownedBodyExpressions_35_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_2_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_14);
                    	            lv_ownedBodyExpressions_35_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_35_0,
                    	                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_36=(Token)match(input,57,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_36, grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_2_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 4 :
                    	    // InternalOCLinEcore.g:3013:6: ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:3013:6: ( (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS ) )
                    	    // InternalOCLinEcore.g:3014:1: (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS )
                    	    {
                    	    // InternalOCLinEcore.g:3014:1: (lv_ownedPostconditions_37_0= rulePostconditionConstraintCS )
                    	    // InternalOCLinEcore.g:3015:3: lv_ownedPostconditions_37_0= rulePostconditionConstraintCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedPostconditionsPostconditionConstraintCSParserRuleCall_10_0_1_3_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_62);
                    	    lv_ownedPostconditions_37_0=rulePostconditionConstraintCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedPostconditions",
                    	              		lv_ownedPostconditions_37_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.PostconditionConstraintCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_38, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3036:7: otherlv_39= ';'
                    {
                    otherlv_39=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_39, 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 "entryRulePackageCS"
    // InternalOCLinEcore.g:3048:1: entryRulePackageCS returns [EObject current=null] : iv_rulePackageCS= rulePackageCS EOF ;
    public final EObject entryRulePackageCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePackageCS = null;


        try {
            // InternalOCLinEcore.g:3049:2: (iv_rulePackageCS= rulePackageCS EOF )
            // InternalOCLinEcore.g:3050:2: iv_rulePackageCS= rulePackageCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPackageCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePackageCS=rulePackageCS();

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

            }

        }

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


    // $ANTLR start "rulePackageCS"
    // InternalOCLinEcore.g:3057:1: rulePackageCS returns [EObject current=null] : (otherlv_0= 'package' ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )? (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )? ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) ;
    public final EObject rulePackageCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        AntlrDatatypeRuleToken lv_nsPrefix_3_0 = null;

        AntlrDatatypeRuleToken lv_nsURI_5_0 = null;

        EObject lv_ownedAnnotations_7_0 = null;

        EObject lv_ownedPackages_8_0 = null;

        EObject lv_ownedClasses_9_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:3060:28: ( (otherlv_0= 'package' ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )? (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )? ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) )
            // InternalOCLinEcore.g:3061:1: (otherlv_0= 'package' ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )? (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )? ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            {
            // InternalOCLinEcore.g:3061:1: (otherlv_0= 'package' ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )? (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )? ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            // InternalOCLinEcore.g:3061:3: otherlv_0= 'package' ( (lv_name_1_0= ruleUnrestrictedName ) ) (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )? (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )? ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            {
            otherlv_0=(Token)match(input,39,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getPackageCSAccess().getPackageKeyword_0());

            }
            // InternalOCLinEcore.g:3065:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:3066:1: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:3066:1: (lv_name_1_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:3067:3: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getPackageCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

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

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_1_0,
                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:3083:2: (otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) ) )?
            int alt85=2;
            int LA85_0 = input.LA(1);

            if ( (LA85_0==56) ) {
                alt85=1;
            }
            switch (alt85) {
                case 1 :
                    // InternalOCLinEcore.g:3083:4: otherlv_2= ':' ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) )
                    {
                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:3087:1: ( (lv_nsPrefix_3_0= ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:3088:1: (lv_nsPrefix_3_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3088:1: (lv_nsPrefix_3_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3089:3: lv_nsPrefix_3_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    lv_nsPrefix_3_0=ruleUnrestrictedName();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
                      	        }
                             		set(
                             			current,
                             			"nsPrefix",
                              		lv_nsPrefix_3_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:3105:4: (otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) ) )?
            int alt86=2;
            int LA86_0 = input.LA(1);

            if ( (LA86_0==62) ) {
                alt86=1;
            }
            switch (alt86) {
                case 1 :
                    // InternalOCLinEcore.g:3105:6: otherlv_4= '=' ( (lv_nsURI_5_0= ruleURI ) )
                    {
                    otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getPackageCSAccess().getEqualsSignKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:3109:1: ( (lv_nsURI_5_0= ruleURI ) )
                    // InternalOCLinEcore.g:3110:1: (lv_nsURI_5_0= ruleURI )
                    {
                    // InternalOCLinEcore.g:3110:1: (lv_nsURI_5_0= ruleURI )
                    // InternalOCLinEcore.g:3111:3: lv_nsURI_5_0= ruleURI
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPackageCSAccess().getNsURIURIParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_22);
                    lv_nsURI_5_0=ruleURI();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
                      	        }
                             		set(
                             			current,
                             			"nsURI",
                              		lv_nsURI_5_0,
                              		"org.eclipse.ocl.xtext.base.Base.URI");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:3127:4: ( (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==60) ) {
                alt88=1;
            }
            else if ( (LA88_0==57) ) {
                alt88=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 88, 0, input);

                throw nvae;
            }
            switch (alt88) {
                case 1 :
                    // InternalOCLinEcore.g:3127:5: (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' )
                    {
                    // InternalOCLinEcore.g:3127:5: (otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}' )
                    // InternalOCLinEcore.g:3127:7: otherlv_6= '{' ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )* otherlv_10= '}'
                    {
                    otherlv_6=(Token)match(input,60,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_4_0_0());

                    }
                    // InternalOCLinEcore.g:3131:1: ( ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) ) | ( (lv_ownedPackages_8_0= rulePackageCS ) ) | ( (lv_ownedClasses_9_0= ruleClassCS ) ) )*
                    loop87:
                    do {
                        int alt87=4;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt87=1;
                            }
                            break;
                        case 39:
                            {
                            alt87=2;
                            }
                            break;
                        case 19:
                        case 23:
                        case 25:
                        case 29:
                        case 42:
                            {
                            alt87=3;
                            }
                            break;

                        }

                        switch (alt87) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3131:2: ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:3131:2: ( (lv_ownedAnnotations_7_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:3132:1: (lv_ownedAnnotations_7_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:3132:1: (lv_ownedAnnotations_7_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:3133:3: lv_ownedAnnotations_7_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_63);
                    	    lv_ownedAnnotations_7_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_7_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:3150:6: ( (lv_ownedPackages_8_0= rulePackageCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:3150:6: ( (lv_ownedPackages_8_0= rulePackageCS ) )
                    	    // InternalOCLinEcore.g:3151:1: (lv_ownedPackages_8_0= rulePackageCS )
                    	    {
                    	    // InternalOCLinEcore.g:3151:1: (lv_ownedPackages_8_0= rulePackageCS )
                    	    // InternalOCLinEcore.g:3152:3: lv_ownedPackages_8_0= rulePackageCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_63);
                    	    lv_ownedPackages_8_0=rulePackageCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedPackages",
                    	              		lv_ownedPackages_8_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.PackageCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:3169:6: ( (lv_ownedClasses_9_0= ruleClassCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:3169:6: ( (lv_ownedClasses_9_0= ruleClassCS ) )
                    	    // InternalOCLinEcore.g:3170:1: (lv_ownedClasses_9_0= ruleClassCS )
                    	    {
                    	    // InternalOCLinEcore.g:3170:1: (lv_ownedClasses_9_0= ruleClassCS )
                    	    // InternalOCLinEcore.g:3171:3: lv_ownedClasses_9_0= ruleClassCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_0_1_2_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_63);
                    	    lv_ownedClasses_9_0=ruleClassCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getPackageCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedClasses",
                    	              		lv_ownedClasses_9_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.ClassCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_10, grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3192:7: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_11, grammarAccess.getPackageCSAccess().getSemicolonKeyword_4_1());

                    }

                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleParameterCS"
    // InternalOCLinEcore.g:3204:1: entryRuleParameterCS returns [EObject current=null] : iv_ruleParameterCS= ruleParameterCS EOF ;
    public final EObject entryRuleParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParameterCS = null;


        try {
            // InternalOCLinEcore.g:3205:2: (iv_ruleParameterCS= ruleParameterCS EOF )
            // InternalOCLinEcore.g:3206: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"
    // InternalOCLinEcore.g:3213: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= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )? ) ;
    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_12=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedAnnotations_11_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:3216: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= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )? ) )
            // InternalOCLinEcore.g:3217: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= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )? )
            {
            // InternalOCLinEcore.g:3217: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= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )? )
            // InternalOCLinEcore.g:3217: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= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )?
            {
            // InternalOCLinEcore.g:3217:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:3218:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:3218:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:3219:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_64);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:3235:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==56) ) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // InternalOCLinEcore.g:3235:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:3239:1: ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    // InternalOCLinEcore.g:3240:1: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalOCLinEcore.g:3240:1: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    // InternalOCLinEcore.g:3241:3: lv_ownedType_2_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_65);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:3257: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 alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==60) ) {
                int LA93_1 = input.LA(2);

                if ( (LA93_1==38||LA93_1==50||LA93_1==65||LA93_1==68) ) {
                    alt93=1;
                }
            }
            switch (alt93) {
                case 1 :
                    // InternalOCLinEcore.g:3257: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,60,FollowSets000.FOLLOW_66); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());

                    }
                    // InternalOCLinEcore.g:3261:1: ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+
                    int cnt92=0;
                    loop92:
                    do {
                        int alt92=2;
                        int LA92_0 = input.LA(1);

                        if ( (LA92_0==38||LA92_0==50||LA92_0==65||LA92_0==68) ) {
                            alt92=1;
                        }


                        switch (alt92) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3261:2: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )?
                    	    {
                    	    // InternalOCLinEcore.g:3261:2: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) )
                    	    int alt90=4;
                    	    switch ( input.LA(1) ) {
                    	    case 38:
                    	        {
                    	        alt90=1;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt90=2;
                    	        }
                    	        break;
                    	    case 50:
                    	        {
                    	        alt90=3;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt90=4;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 90, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt90) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3261:3: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3261:3: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            // InternalOCLinEcore.g:3262:1: (lv_qualifiers_4_0= 'ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3262:1: (lv_qualifiers_4_0= 'ordered' )
                    	            // InternalOCLinEcore.g:3263:3: lv_qualifiers_4_0= 'ordered'
                    	            {
                    	            lv_qualifiers_4_0=(Token)match(input,38,FollowSets000.FOLLOW_67); 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 :
                    	            // InternalOCLinEcore.g:3277:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3277:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            // InternalOCLinEcore.g:3278:1: (lv_qualifiers_5_0= '!ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3278:1: (lv_qualifiers_5_0= '!ordered' )
                    	            // InternalOCLinEcore.g:3279:3: lv_qualifiers_5_0= '!ordered'
                    	            {
                    	            lv_qualifiers_5_0=(Token)match(input,65,FollowSets000.FOLLOW_67); 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 :
                    	            // InternalOCLinEcore.g:3293:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3293:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            // InternalOCLinEcore.g:3294:1: (lv_qualifiers_6_0= 'unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3294:1: (lv_qualifiers_6_0= 'unique' )
                    	            // InternalOCLinEcore.g:3295:3: lv_qualifiers_6_0= 'unique'
                    	            {
                    	            lv_qualifiers_6_0=(Token)match(input,50,FollowSets000.FOLLOW_67); 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 :
                    	            // InternalOCLinEcore.g:3309:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3309:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            // InternalOCLinEcore.g:3310:1: (lv_qualifiers_7_0= '!unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3310:1: (lv_qualifiers_7_0= '!unique' )
                    	            // InternalOCLinEcore.g:3311:3: lv_qualifiers_7_0= '!unique'
                    	            {
                    	            lv_qualifiers_7_0=(Token)match(input,68,FollowSets000.FOLLOW_67); 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;

                    	    }

                    	    // InternalOCLinEcore.g:3324:3: (otherlv_8= ',' )?
                    	    int alt91=2;
                    	    int LA91_0 = input.LA(1);

                    	    if ( (LA91_0==59) ) {
                    	        alt91=1;
                    	    }
                    	    switch (alt91) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3324:5: otherlv_8= ','
                    	            {
                    	            otherlv_8=(Token)match(input,59,FollowSets000.FOLLOW_68); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_8, grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_9, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:3332:3: (otherlv_10= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}' )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==60) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalOCLinEcore.g:3332:5: otherlv_10= '{' ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )* otherlv_12= '}'
                    {
                    otherlv_10=(Token)match(input,60,FollowSets000.FOLLOW_48); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:3336:1: ( (lv_ownedAnnotations_11_0= ruleAnnotationElementCS ) )*
                    loop94:
                    do {
                        int alt94=2;
                        int LA94_0 = input.LA(1);

                        if ( (LA94_0==58||LA94_0==73||LA94_0==80) ) {
                            alt94=1;
                        }


                        switch (alt94) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3337:1: (lv_ownedAnnotations_11_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:3337:1: (lv_ownedAnnotations_11_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:3338:3: lv_ownedAnnotations_11_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_48);
                    	    lv_ownedAnnotations_11_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getParameterCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_11_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_12, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_2());

                    }

                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleImplicitOppositeCS"
    // InternalOCLinEcore.g:3366:1: entryRuleImplicitOppositeCS returns [EObject current=null] : iv_ruleImplicitOppositeCS= ruleImplicitOppositeCS EOF ;
    public final EObject entryRuleImplicitOppositeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleImplicitOppositeCS = null;


        try {
            // InternalOCLinEcore.g:3367:2: (iv_ruleImplicitOppositeCS= ruleImplicitOppositeCS EOF )
            // InternalOCLinEcore.g:3368:2: iv_ruleImplicitOppositeCS= ruleImplicitOppositeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getImplicitOppositeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleImplicitOppositeCS=ruleImplicitOppositeCS();

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

            }

        }

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


    // $ANTLR start "ruleImplicitOppositeCS"
    // InternalOCLinEcore.g:3375:1: ruleImplicitOppositeCS returns [EObject current=null] : (otherlv_0= 'opposite' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) ) (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )? ) ;
    public final EObject ruleImplicitOppositeCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token lv_qualifiers_5_0=null;
        Token lv_qualifiers_6_0=null;
        Token lv_qualifiers_7_0=null;
        Token lv_qualifiers_8_0=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedType_3_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:3378:28: ( (otherlv_0= 'opposite' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) ) (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )? ) )
            // InternalOCLinEcore.g:3379:1: (otherlv_0= 'opposite' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) ) (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )? )
            {
            // InternalOCLinEcore.g:3379:1: (otherlv_0= 'opposite' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) ) (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )? )
            // InternalOCLinEcore.g:3379:3: otherlv_0= 'opposite' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) ) (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )?
            {
            otherlv_0=(Token)match(input,76,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getImplicitOppositeCSAccess().getOppositeKeyword_0());

            }
            // InternalOCLinEcore.g:3383:1: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:3384:1: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:3384:1: (lv_name_1_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:3385:3: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getImplicitOppositeCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

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

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getImplicitOppositeCSRule());
              	        }
                     		set(
                     			current,
                     			"name",
                      		lv_name_1_0,
                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

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

            }
            // InternalOCLinEcore.g:3405:1: ( (lv_ownedType_3_0= ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:3406:1: (lv_ownedType_3_0= ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:3406:1: (lv_ownedType_3_0= ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:3407:3: lv_ownedType_3_0= ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_65);
            lv_ownedType_3_0=ruleTypedMultiplicityRefCS();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getImplicitOppositeCSRule());
              	        }
                     		set(
                     			current,
                     			"ownedType",
                      		lv_ownedType_3_0,
                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.TypedMultiplicityRefCS");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:3423:2: (otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}' )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==60) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // InternalOCLinEcore.g:3423:4: otherlv_4= '{' ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+ otherlv_10= '}'
                    {
                    otherlv_4=(Token)match(input,60,FollowSets000.FOLLOW_66); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getImplicitOppositeCSAccess().getLeftCurlyBracketKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:3427:1: ( ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )? )+
                    int cnt98=0;
                    loop98:
                    do {
                        int alt98=2;
                        int LA98_0 = input.LA(1);

                        if ( (LA98_0==38||LA98_0==50||LA98_0==65||LA98_0==68) ) {
                            alt98=1;
                        }


                        switch (alt98) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3427:2: ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) ) (otherlv_9= ',' )?
                    	    {
                    	    // InternalOCLinEcore.g:3427:2: ( ( (lv_qualifiers_5_0= 'ordered' ) ) | ( (lv_qualifiers_6_0= '!ordered' ) ) | ( (lv_qualifiers_7_0= 'unique' ) ) | ( (lv_qualifiers_8_0= '!unique' ) ) )
                    	    int alt96=4;
                    	    switch ( input.LA(1) ) {
                    	    case 38:
                    	        {
                    	        alt96=1;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt96=2;
                    	        }
                    	        break;
                    	    case 50:
                    	        {
                    	        alt96=3;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt96=4;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 96, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt96) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3427:3: ( (lv_qualifiers_5_0= 'ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3427:3: ( (lv_qualifiers_5_0= 'ordered' ) )
                    	            // InternalOCLinEcore.g:3428:1: (lv_qualifiers_5_0= 'ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3428:1: (lv_qualifiers_5_0= 'ordered' )
                    	            // InternalOCLinEcore.g:3429:3: lv_qualifiers_5_0= 'ordered'
                    	            {
                    	            lv_qualifiers_5_0=(Token)match(input,38,FollowSets000.FOLLOW_67); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_5_0, grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getImplicitOppositeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_5_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalOCLinEcore.g:3443:6: ( (lv_qualifiers_6_0= '!ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3443:6: ( (lv_qualifiers_6_0= '!ordered' ) )
                    	            // InternalOCLinEcore.g:3444:1: (lv_qualifiers_6_0= '!ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3444:1: (lv_qualifiers_6_0= '!ordered' )
                    	            // InternalOCLinEcore.g:3445:3: lv_qualifiers_6_0= '!ordered'
                    	            {
                    	            lv_qualifiers_6_0=(Token)match(input,65,FollowSets000.FOLLOW_67); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_6_0, grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getImplicitOppositeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_6_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalOCLinEcore.g:3459:6: ( (lv_qualifiers_7_0= 'unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3459:6: ( (lv_qualifiers_7_0= 'unique' ) )
                    	            // InternalOCLinEcore.g:3460:1: (lv_qualifiers_7_0= 'unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3460:1: (lv_qualifiers_7_0= 'unique' )
                    	            // InternalOCLinEcore.g:3461:3: lv_qualifiers_7_0= 'unique'
                    	            {
                    	            lv_qualifiers_7_0=(Token)match(input,50,FollowSets000.FOLLOW_67); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_7_0, grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getImplicitOppositeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_7_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalOCLinEcore.g:3475:6: ( (lv_qualifiers_8_0= '!unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3475:6: ( (lv_qualifiers_8_0= '!unique' ) )
                    	            // InternalOCLinEcore.g:3476:1: (lv_qualifiers_8_0= '!unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3476:1: (lv_qualifiers_8_0= '!unique' )
                    	            // InternalOCLinEcore.g:3477:3: lv_qualifiers_8_0= '!unique'
                    	            {
                    	            lv_qualifiers_8_0=(Token)match(input,68,FollowSets000.FOLLOW_67); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                      newLeafNode(lv_qualifiers_8_0, grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              	        if (current==null) {
                    	              	            current = createModelElement(grammarAccess.getImplicitOppositeCSRule());
                    	              	        }
                    	                     		addWithLastConsumed(current, "qualifiers", lv_qualifiers_8_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalOCLinEcore.g:3490:3: (otherlv_9= ',' )?
                    	    int alt97=2;
                    	    int LA97_0 = input.LA(1);

                    	    if ( (LA97_0==59) ) {
                    	        alt97=1;
                    	    }
                    	    switch (alt97) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3490:5: otherlv_9= ','
                    	            {
                    	            otherlv_9=(Token)match(input,59,FollowSets000.FOLLOW_68); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_9, grammarAccess.getImplicitOppositeCSAccess().getCommaKeyword_4_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_10, grammarAccess.getImplicitOppositeCSAccess().getRightCurlyBracketKeyword_4_2());

                    }

                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleReferenceCS"
    // InternalOCLinEcore.g:3506:1: entryRuleReferenceCS returns [EObject current=null] : iv_ruleReferenceCS= ruleReferenceCS EOF ;
    public final EObject entryRuleReferenceCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReferenceCS = null;


        try {
            // InternalOCLinEcore.g:3507:2: (iv_ruleReferenceCS= ruleReferenceCS EOF )
            // InternalOCLinEcore.g:3508: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"
    // InternalOCLinEcore.g:3515: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= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' ) ) ;
    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_35=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        Token otherlv_40=null;
        Token otherlv_42=null;
        Token otherlv_44=null;
        Token otherlv_45=null;
        Token otherlv_47=null;
        Token otherlv_49=null;
        Token otherlv_51=null;
        Token otherlv_52=null;
        Token otherlv_53=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_9_0 = null;

        EObject lv_ownedAnnotations_34_0 = null;

        EObject lv_ownedDefaultExpressions_43_0 = null;

        EObject lv_ownedDefaultExpressions_48_0 = null;

        EObject lv_ownedImplicitOpposites_50_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:3518: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= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' ) ) )
            // InternalOCLinEcore.g:3519: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= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' ) )
            {
            // InternalOCLinEcore.g:3519: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= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' ) )
            // InternalOCLinEcore.g:3519: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= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' )
            {
            // InternalOCLinEcore.g:3519:2: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt102=3;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==47) ) {
                alt102=1;
            }
            else if ( (LA102_0==26) ) {
                alt102=2;
            }
            switch (alt102) {
                case 1 :
                    // InternalOCLinEcore.g:3519:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalOCLinEcore.g:3519:3: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalOCLinEcore.g:3519:4: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalOCLinEcore.g:3519:4: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalOCLinEcore.g:3520:1: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalOCLinEcore.g:3520:1: (lv_qualifiers_0_0= 'static' )
                    // InternalOCLinEcore.g:3521:3: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,47,FollowSets000.FOLLOW_69); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:3534:2: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt100=2;
                    int LA100_0 = input.LA(1);

                    if ( (LA100_0==26) ) {
                        alt100=1;
                    }
                    switch (alt100) {
                        case 1 :
                            // InternalOCLinEcore.g:3535:1: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalOCLinEcore.g:3535:1: (lv_qualifiers_1_0= 'definition' )
                            // InternalOCLinEcore.g:3536:3: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,26,FollowSets000.FOLLOW_70); 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 :
                    // InternalOCLinEcore.g:3550:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalOCLinEcore.g:3550:6: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalOCLinEcore.g:3550:7: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalOCLinEcore.g:3550:7: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalOCLinEcore.g:3551:1: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalOCLinEcore.g:3551:1: (lv_qualifiers_2_0= 'definition' )
                    // InternalOCLinEcore.g:3552:3: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,26,FollowSets000.FOLLOW_71); 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");

                    }

                    }


                    }

                    // InternalOCLinEcore.g:3565:2: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt101=2;
                    int LA101_0 = input.LA(1);

                    if ( (LA101_0==47) ) {
                        alt101=1;
                    }
                    switch (alt101) {
                        case 1 :
                            // InternalOCLinEcore.g:3566:1: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalOCLinEcore.g:3566:1: (lv_qualifiers_3_0= 'static' )
                            // InternalOCLinEcore.g:3567:3: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,47,FollowSets000.FOLLOW_70); 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,43,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());

            }
            // InternalOCLinEcore.g:3584:1: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:3585:1: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:3585:1: (lv_name_5_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:3586:3: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_72);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:3602:2: (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==77) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // InternalOCLinEcore.g:3602:4: otherlv_6= '#' ( ( ruleUnrestrictedName ) )
                    {
                    otherlv_6=(Token)match(input,77,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());

                    }
                    // InternalOCLinEcore.g:3606:1: ( ( ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:3607:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3607:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3608: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_28);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:3624:4: (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==56) ) {
                alt104=1;
            }
            switch (alt104) {
                case 1 :
                    // InternalOCLinEcore.g:3624:6: otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_8=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:3628:1: ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    // InternalOCLinEcore.g:3629:1: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalOCLinEcore.g:3629:1: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    // InternalOCLinEcore.g:3630:3: lv_ownedType_9_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedMultiplicityRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:3646:4: (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==62) ) {
                alt105=1;
            }
            switch (alt105) {
                case 1 :
                    // InternalOCLinEcore.g:3646:6: otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_10=(Token)match(input,62,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());

                    }
                    // InternalOCLinEcore.g:3650:1: ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:3651:1: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3651:1: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3652:3: lv_default_11_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_11_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_22); 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;

            }

            // InternalOCLinEcore.g:3668: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 alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==60) ) {
                int LA109_1 = input.LA(2);

                if ( (LA109_1==24||LA109_1==28||LA109_1==38||LA109_1==44||LA109_1==46||(LA109_1>=49 && LA109_1<=52)||LA109_1==63||(LA109_1>=65 && LA109_1<=70)||(LA109_1>=78 && LA109_1<=79)) ) {
                    alt109=1;
                }
            }
            switch (alt109) {
                case 1 :
                    // InternalOCLinEcore.g:3668: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,60,FollowSets000.FOLLOW_73); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalOCLinEcore.g:3672: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 cnt108=0;
                    loop108:
                    do {
                        int alt108=2;
                        int LA108_0 = input.LA(1);

                        if ( (LA108_0==24||LA108_0==28||LA108_0==38||LA108_0==44||LA108_0==46||(LA108_0>=49 && LA108_0<=52)||LA108_0==63||(LA108_0>=65 && LA108_0<=70)||(LA108_0>=78 && LA108_0<=79)) ) {
                            alt108=1;
                        }


                        switch (alt108) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3672: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= ',' )?
                    	    {
                    	    // InternalOCLinEcore.g:3672: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 alt106=18;
                    	    switch ( input.LA(1) ) {
                    	    case 24:
                    	        {
                    	        alt106=1;
                    	        }
                    	        break;
                    	    case 78:
                    	        {
                    	        alt106=2;
                    	        }
                    	        break;
                    	    case 28:
                    	        {
                    	        alt106=3;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt106=4;
                    	        }
                    	        break;
                    	    case 38:
                    	        {
                    	        alt106=5;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt106=6;
                    	        }
                    	        break;
                    	    case 44:
                    	        {
                    	        alt106=7;
                    	        }
                    	        break;
                    	    case 66:
                    	        {
                    	        alt106=8;
                    	        }
                    	        break;
                    	    case 46:
                    	        {
                    	        alt106=9;
                    	        }
                    	        break;
                    	    case 79:
                    	        {
                    	        alt106=10;
                    	        }
                    	        break;
                    	    case 49:
                    	        {
                    	        alt106=11;
                    	        }
                    	        break;
                    	    case 67:
                    	        {
                    	        alt106=12;
                    	        }
                    	        break;
                    	    case 50:
                    	        {
                    	        alt106=13;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt106=14;
                    	        }
                    	        break;
                    	    case 51:
                    	        {
                    	        alt106=15;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt106=16;
                    	        }
                    	        break;
                    	    case 52:
                    	        {
                    	        alt106=17;
                    	        }
                    	        break;
                    	    case 70:
                    	        {
                    	        alt106=18;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 106, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt106) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3672:3: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3672:3: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            // InternalOCLinEcore.g:3673:1: (lv_qualifiers_13_0= 'composes' )
                    	            {
                    	            // InternalOCLinEcore.g:3673:1: (lv_qualifiers_13_0= 'composes' )
                    	            // InternalOCLinEcore.g:3674:3: lv_qualifiers_13_0= 'composes'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,24,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3688:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3688:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            // InternalOCLinEcore.g:3689:1: (lv_qualifiers_14_0= '!composes' )
                    	            {
                    	            // InternalOCLinEcore.g:3689:1: (lv_qualifiers_14_0= '!composes' )
                    	            // InternalOCLinEcore.g:3690:3: lv_qualifiers_14_0= '!composes'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,78,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3704:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3704:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            // InternalOCLinEcore.g:3705:1: (lv_qualifiers_15_0= 'derived' )
                    	            {
                    	            // InternalOCLinEcore.g:3705:1: (lv_qualifiers_15_0= 'derived' )
                    	            // InternalOCLinEcore.g:3706:3: lv_qualifiers_15_0= 'derived'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,28,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3720:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3720:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            // InternalOCLinEcore.g:3721:1: (lv_qualifiers_16_0= '!derived' )
                    	            {
                    	            // InternalOCLinEcore.g:3721:1: (lv_qualifiers_16_0= '!derived' )
                    	            // InternalOCLinEcore.g:3722:3: lv_qualifiers_16_0= '!derived'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,63,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3736:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3736:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            // InternalOCLinEcore.g:3737:1: (lv_qualifiers_17_0= 'ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3737:1: (lv_qualifiers_17_0= 'ordered' )
                    	            // InternalOCLinEcore.g:3738:3: lv_qualifiers_17_0= 'ordered'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,38,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3752:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3752:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            // InternalOCLinEcore.g:3753:1: (lv_qualifiers_18_0= '!ordered' )
                    	            {
                    	            // InternalOCLinEcore.g:3753:1: (lv_qualifiers_18_0= '!ordered' )
                    	            // InternalOCLinEcore.g:3754:3: lv_qualifiers_18_0= '!ordered'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,65,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3768:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3768:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            // InternalOCLinEcore.g:3769:1: (lv_qualifiers_19_0= 'readonly' )
                    	            {
                    	            // InternalOCLinEcore.g:3769:1: (lv_qualifiers_19_0= 'readonly' )
                    	            // InternalOCLinEcore.g:3770:3: lv_qualifiers_19_0= 'readonly'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,44,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3784:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3784:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            // InternalOCLinEcore.g:3785:1: (lv_qualifiers_20_0= '!readonly' )
                    	            {
                    	            // InternalOCLinEcore.g:3785:1: (lv_qualifiers_20_0= '!readonly' )
                    	            // InternalOCLinEcore.g:3786:3: lv_qualifiers_20_0= '!readonly'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,66,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3800:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3800:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            // InternalOCLinEcore.g:3801:1: (lv_qualifiers_21_0= 'resolve' )
                    	            {
                    	            // InternalOCLinEcore.g:3801:1: (lv_qualifiers_21_0= 'resolve' )
                    	            // InternalOCLinEcore.g:3802:3: lv_qualifiers_21_0= 'resolve'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,46,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3816:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3816:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            // InternalOCLinEcore.g:3817:1: (lv_qualifiers_22_0= '!resolve' )
                    	            {
                    	            // InternalOCLinEcore.g:3817:1: (lv_qualifiers_22_0= '!resolve' )
                    	            // InternalOCLinEcore.g:3818:3: lv_qualifiers_22_0= '!resolve'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,79,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3832:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3832:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            // InternalOCLinEcore.g:3833:1: (lv_qualifiers_23_0= 'transient' )
                    	            {
                    	            // InternalOCLinEcore.g:3833:1: (lv_qualifiers_23_0= 'transient' )
                    	            // InternalOCLinEcore.g:3834:3: lv_qualifiers_23_0= 'transient'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,49,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3848:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3848:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            // InternalOCLinEcore.g:3849:1: (lv_qualifiers_24_0= '!transient' )
                    	            {
                    	            // InternalOCLinEcore.g:3849:1: (lv_qualifiers_24_0= '!transient' )
                    	            // InternalOCLinEcore.g:3850:3: lv_qualifiers_24_0= '!transient'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,67,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3864:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3864:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            // InternalOCLinEcore.g:3865:1: (lv_qualifiers_25_0= 'unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3865:1: (lv_qualifiers_25_0= 'unique' )
                    	            // InternalOCLinEcore.g:3866:3: lv_qualifiers_25_0= 'unique'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,50,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3880:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3880:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            // InternalOCLinEcore.g:3881:1: (lv_qualifiers_26_0= '!unique' )
                    	            {
                    	            // InternalOCLinEcore.g:3881:1: (lv_qualifiers_26_0= '!unique' )
                    	            // InternalOCLinEcore.g:3882:3: lv_qualifiers_26_0= '!unique'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,68,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3896:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3896:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            // InternalOCLinEcore.g:3897:1: (lv_qualifiers_27_0= 'unsettable' )
                    	            {
                    	            // InternalOCLinEcore.g:3897:1: (lv_qualifiers_27_0= 'unsettable' )
                    	            // InternalOCLinEcore.g:3898:3: lv_qualifiers_27_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_27_0=(Token)match(input,51,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3912:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3912:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            // InternalOCLinEcore.g:3913:1: (lv_qualifiers_28_0= '!unsettable' )
                    	            {
                    	            // InternalOCLinEcore.g:3913:1: (lv_qualifiers_28_0= '!unsettable' )
                    	            // InternalOCLinEcore.g:3914:3: lv_qualifiers_28_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_28_0=(Token)match(input,69,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3928:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3928:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            // InternalOCLinEcore.g:3929:1: (lv_qualifiers_29_0= 'volatile' )
                    	            {
                    	            // InternalOCLinEcore.g:3929:1: (lv_qualifiers_29_0= 'volatile' )
                    	            // InternalOCLinEcore.g:3930:3: lv_qualifiers_29_0= 'volatile'
                    	            {
                    	            lv_qualifiers_29_0=(Token)match(input,52,FollowSets000.FOLLOW_74); 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 :
                    	            // InternalOCLinEcore.g:3944:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            {
                    	            // InternalOCLinEcore.g:3944:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            // InternalOCLinEcore.g:3945:1: (lv_qualifiers_30_0= '!volatile' )
                    	            {
                    	            // InternalOCLinEcore.g:3945:1: (lv_qualifiers_30_0= '!volatile' )
                    	            // InternalOCLinEcore.g:3946:3: lv_qualifiers_30_0= '!volatile'
                    	            {
                    	            lv_qualifiers_30_0=(Token)match(input,70,FollowSets000.FOLLOW_74); 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;

                    	    }

                    	    // InternalOCLinEcore.g:3959:3: (otherlv_31= ',' )?
                    	    int alt107=2;
                    	    int LA107_0 = input.LA(1);

                    	    if ( (LA107_0==59) ) {
                    	        alt107=1;
                    	    }
                    	    switch (alt107) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:3959:5: otherlv_31= ','
                    	            {
                    	            otherlv_31=(Token)match(input,59,FollowSets000.FOLLOW_75); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	                  	newLeafNode(otherlv_31, grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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

                    otherlv_32=(Token)match(input,61,FollowSets000.FOLLOW_22); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_32, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:3967:3: ( (otherlv_33= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' ) | otherlv_53= ';' )
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==60) ) {
                alt116=1;
            }
            else if ( (LA116_0==57) ) {
                alt116=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 116, 0, input);

                throw nvae;
            }
            switch (alt116) {
                case 1 :
                    // InternalOCLinEcore.g:3967:4: (otherlv_33= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' )
                    {
                    // InternalOCLinEcore.g:3967:4: (otherlv_33= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}' )
                    // InternalOCLinEcore.g:3967:6: otherlv_33= '{' ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )* otherlv_52= '}'
                    {
                    otherlv_33=(Token)match(input,60,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_33, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalOCLinEcore.g:3971:1: ( ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) ) | (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' ) | (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' ) | (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' ) | ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' ) )*
                    loop115:
                    do {
                        int alt115=6;
                        switch ( input.LA(1) ) {
                        case 58:
                        case 73:
                        case 80:
                            {
                            alt115=1;
                            }
                            break;
                        case 35:
                            {
                            alt115=2;
                            }
                            break;
                        case 33:
                            {
                            alt115=3;
                            }
                            break;
                        case 27:
                            {
                            alt115=4;
                            }
                            break;
                        case 76:
                            {
                            alt115=5;
                            }
                            break;

                        }

                        switch (alt115) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:3971:2: ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:3971:2: ( (lv_ownedAnnotations_34_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:3972:1: (lv_ownedAnnotations_34_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:3972:1: (lv_ownedAnnotations_34_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:3973:3: lv_ownedAnnotations_34_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_76);
                    	    lv_ownedAnnotations_34_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_34_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:3990:6: (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:3990:6: (otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';' )
                    	    // InternalOCLinEcore.g:3990:8: otherlv_35= 'key' ( ( ruleUnrestrictedName ) ) (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_39= ';'
                    	    {
                    	    otherlv_35=(Token)match(input,35,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_35, grammarAccess.getReferenceCSAccess().getKeyKeyword_7_0_1_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:3994:1: ( ( ruleUnrestrictedName ) )
                    	    // InternalOCLinEcore.g:3995:1: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalOCLinEcore.g:3995:1: ( ruleUnrestrictedName )
                    	    // InternalOCLinEcore.g:3996:3: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      		  /* */

                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_1_0());

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

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

                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }

                    	    // InternalOCLinEcore.g:4012:2: (otherlv_37= ',' ( ( ruleUnrestrictedName ) ) )*
                    	    loop110:
                    	    do {
                    	        int alt110=2;
                    	        int LA110_0 = input.LA(1);

                    	        if ( (LA110_0==59) ) {
                    	            alt110=1;
                    	        }


                    	        switch (alt110) {
                    	    	case 1 :
                    	    	    // InternalOCLinEcore.g:4012:4: otherlv_37= ',' ( ( ruleUnrestrictedName ) )
                    	    	    {
                    	    	    otherlv_37=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    	    	    if ( state.backtracking==0 ) {

                    	    	          	newLeafNode(otherlv_37, grammarAccess.getReferenceCSAccess().getCommaKeyword_7_0_1_1_2_0());

                    	    	    }
                    	    	    // InternalOCLinEcore.g:4016:1: ( ( ruleUnrestrictedName ) )
                    	    	    // InternalOCLinEcore.g:4017:1: ( ruleUnrestrictedName )
                    	    	    {
                    	    	    // InternalOCLinEcore.g:4017:1: ( ruleUnrestrictedName )
                    	    	    // InternalOCLinEcore.g:4018:3: ruleUnrestrictedName
                    	    	    {
                    	    	    if ( state.backtracking==0 ) {

                    	    	      		  /* */

                    	    	    }
                    	    	    if ( state.backtracking==0 ) {

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

                    	    	    }
                    	    	    if ( state.backtracking==0 ) {

                    	    	      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_2_1_0());

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

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

                    	    	      	        afterParserOrEnumRuleCall();

                    	    	    }

                    	    	    }


                    	    	    }


                    	    	    }
                    	    	    break;

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

                    	    otherlv_39=(Token)match(input,57,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_39, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_3());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:4039:6: (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:4039:6: (otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';' )
                    	    // InternalOCLinEcore.g:4039:8: otherlv_40= 'initial' ( ruleUnrestrictedName )? otherlv_42= ':' ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )? otherlv_44= ';'
                    	    {
                    	    otherlv_40=(Token)match(input,33,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_40, grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:4043:1: ( ruleUnrestrictedName )?
                    	    int alt111=2;
                    	    int LA111_0 = input.LA(1);

                    	    if ( ((LA111_0>=RULE_SIMPLE_ID && LA111_0<=RULE_ESCAPED_ID)||LA111_0==17||(LA111_0>=19 && LA111_0<=53)||LA111_0==58||LA111_0==71||(LA111_0>=73 && LA111_0<=74)||LA111_0==76||LA111_0==80) ) {
                    	        alt111=1;
                    	    }
                    	    switch (alt111) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:4044:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_2_1());

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

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_42=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_42, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_2_2());

                    	    }
                    	    // InternalOCLinEcore.g:4058:1: ( (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS ) )?
                    	    int alt112=2;
                    	    int LA112_0 = input.LA(1);

                    	    if ( ((LA112_0>=RULE_INT && LA112_0<=RULE_SINGLE_QUOTED_STRING)||(LA112_0>=RULE_UNQUOTED_STRING && LA112_0<=RULE_ESCAPED_ID)||(LA112_0>=17 && LA112_0<=54)||LA112_0==58||LA112_0==71||(LA112_0>=73 && LA112_0<=74)||LA112_0==76||LA112_0==80||(LA112_0>=83 && LA112_0<=84)||(LA112_0>=98 && LA112_0<=99)||(LA112_0>=101 && LA112_0<=113)||LA112_0==116||(LA112_0>=118 && LA112_0<=121)||LA112_0==128||(LA112_0>=133 && LA112_0<=134)) ) {
                    	        alt112=1;
                    	    }
                    	    switch (alt112) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:4059:1: (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS )
                    	            {
                    	            // InternalOCLinEcore.g:4059:1: (lv_ownedDefaultExpressions_43_0= ruleSpecificationCS )
                    	            // InternalOCLinEcore.g:4060:3: lv_ownedDefaultExpressions_43_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_2_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_14);
                    	            lv_ownedDefaultExpressions_43_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_43_0,
                    	                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_44=(Token)match(input,57,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_44, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_2_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 4 :
                    	    // InternalOCLinEcore.g:4081:6: (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:4081:6: (otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';' )
                    	    // InternalOCLinEcore.g:4081:8: otherlv_45= 'derivation' ( ruleUnrestrictedName )? otherlv_47= ':' ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )? otherlv_49= ';'
                    	    {
                    	    otherlv_45=(Token)match(input,27,FollowSets000.FOLLOW_15); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_45, grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_3_0());

                    	    }
                    	    // InternalOCLinEcore.g:4085:1: ( ruleUnrestrictedName )?
                    	    int alt113=2;
                    	    int LA113_0 = input.LA(1);

                    	    if ( ((LA113_0>=RULE_SIMPLE_ID && LA113_0<=RULE_ESCAPED_ID)||LA113_0==17||(LA113_0>=19 && LA113_0<=53)||LA113_0==58||LA113_0==71||(LA113_0>=73 && LA113_0<=74)||LA113_0==76||LA113_0==80) ) {
                    	        alt113=1;
                    	    }
                    	    switch (alt113) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:4086:2: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	  /* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	                      newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_3_1());

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

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

                    	                      afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_47=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_47, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_3_2());

                    	    }
                    	    // InternalOCLinEcore.g:4100:1: ( (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS ) )?
                    	    int alt114=2;
                    	    int LA114_0 = input.LA(1);

                    	    if ( ((LA114_0>=RULE_INT && LA114_0<=RULE_SINGLE_QUOTED_STRING)||(LA114_0>=RULE_UNQUOTED_STRING && LA114_0<=RULE_ESCAPED_ID)||(LA114_0>=17 && LA114_0<=54)||LA114_0==58||LA114_0==71||(LA114_0>=73 && LA114_0<=74)||LA114_0==76||LA114_0==80||(LA114_0>=83 && LA114_0<=84)||(LA114_0>=98 && LA114_0<=99)||(LA114_0>=101 && LA114_0<=113)||LA114_0==116||(LA114_0>=118 && LA114_0<=121)||LA114_0==128||(LA114_0>=133 && LA114_0<=134)) ) {
                    	        alt114=1;
                    	    }
                    	    switch (alt114) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:4101:1: (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS )
                    	            {
                    	            // InternalOCLinEcore.g:4101:1: (lv_ownedDefaultExpressions_48_0= ruleSpecificationCS )
                    	            // InternalOCLinEcore.g:4102:3: lv_ownedDefaultExpressions_48_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_3_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_14);
                    	            lv_ownedDefaultExpressions_48_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_48_0,
                    	                      		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.SpecificationCS");
                    	              	        afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_49=(Token)match(input,57,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_49, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_3_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 5 :
                    	    // InternalOCLinEcore.g:4123:6: ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' )
                    	    {
                    	    // InternalOCLinEcore.g:4123:6: ( ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';' )
                    	    // InternalOCLinEcore.g:4123:7: ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) ) otherlv_51= ';'
                    	    {
                    	    // InternalOCLinEcore.g:4123:7: ( (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS ) )
                    	    // InternalOCLinEcore.g:4124:1: (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS )
                    	    {
                    	    // InternalOCLinEcore.g:4124:1: (lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS )
                    	    // InternalOCLinEcore.g:4125:3: lv_ownedImplicitOpposites_50_0= ruleImplicitOppositeCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesImplicitOppositeCSParserRuleCall_7_0_1_4_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_14);
                    	    lv_ownedImplicitOpposites_50_0=ruleImplicitOppositeCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedImplicitOpposites",
                    	              		lv_ownedImplicitOpposites_50_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.ImplicitOppositeCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }

                    	    otherlv_51=(Token)match(input,57,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_51, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_4_1());

                    	    }

                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_52, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4150:7: otherlv_53= ';'
                    {
                    otherlv_53=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_53, 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 "entryRuleSpecificationCS"
    // InternalOCLinEcore.g:4162:1: entryRuleSpecificationCS returns [EObject current=null] : iv_ruleSpecificationCS= ruleSpecificationCS EOF ;
    public final EObject entryRuleSpecificationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSpecificationCS = null;


        try {
            // InternalOCLinEcore.g:4163:2: (iv_ruleSpecificationCS= ruleSpecificationCS EOF )
            // InternalOCLinEcore.g:4164: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"
    // InternalOCLinEcore.g:4171: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 {
            // InternalOCLinEcore.g:4174:28: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) ) )
            // InternalOCLinEcore.g:4175:1: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            {
            // InternalOCLinEcore.g:4175:1: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( ((LA117_0>=RULE_INT && LA117_0<=RULE_SINGLE_QUOTED_STRING)||(LA117_0>=RULE_SIMPLE_ID && LA117_0<=RULE_ESCAPED_ID)||(LA117_0>=17 && LA117_0<=54)||LA117_0==58||LA117_0==71||(LA117_0>=73 && LA117_0<=74)||LA117_0==76||LA117_0==80||(LA117_0>=83 && LA117_0<=84)||(LA117_0>=98 && LA117_0<=99)||(LA117_0>=101 && LA117_0<=113)||LA117_0==116||(LA117_0>=118 && LA117_0<=121)||LA117_0==128||(LA117_0>=133 && LA117_0<=134)) ) {
                alt117=1;
            }
            else if ( (LA117_0==RULE_UNQUOTED_STRING) ) {
                alt117=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 117, 0, input);

                throw nvae;
            }
            switch (alt117) {
                case 1 :
                    // InternalOCLinEcore.g:4175:2: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    {
                    // InternalOCLinEcore.g:4175:2: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalOCLinEcore.g:4176:1: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalOCLinEcore.g:4176:1: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalOCLinEcore.g:4177: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 :
                    // InternalOCLinEcore.g:4194:6: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    {
                    // InternalOCLinEcore.g:4194:6: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    // InternalOCLinEcore.g:4195:1: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:4195:1: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    // InternalOCLinEcore.g:4196: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.ocl.xtext.oclinecore.OCLinEcore.UNQUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleStructuredClassCS"
    // InternalOCLinEcore.g:4220:1: entryRuleStructuredClassCS returns [EObject current=null] : iv_ruleStructuredClassCS= ruleStructuredClassCS EOF ;
    public final EObject entryRuleStructuredClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuredClassCS = null;


        try {
            // InternalOCLinEcore.g:4221:2: (iv_ruleStructuredClassCS= ruleStructuredClassCS EOF )
            // InternalOCLinEcore.g:4222: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"
    // InternalOCLinEcore.g:4229: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_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' ) ) ;
    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_18=null;
        Token otherlv_19=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_ownedAnnotations_14_0 = null;

        EObject lv_ownedOperations_15_0 = null;

        EObject lv_ownedProperties_16_0 = null;

        EObject lv_ownedConstraints_17_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:4232: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_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' ) ) )
            // InternalOCLinEcore.g:4233: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_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' ) )
            {
            // InternalOCLinEcore.g:4233: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_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' ) )
            // InternalOCLinEcore.g:4233: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_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' )
            {
            // InternalOCLinEcore.g:4233:2: ( (lv_isAbstract_0_0= 'abstract' ) )?
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( (LA118_0==19) ) {
                alt118=1;
            }
            switch (alt118) {
                case 1 :
                    // InternalOCLinEcore.g:4234:1: (lv_isAbstract_0_0= 'abstract' )
                    {
                    // InternalOCLinEcore.g:4234:1: (lv_isAbstract_0_0= 'abstract' )
                    // InternalOCLinEcore.g:4235:3: lv_isAbstract_0_0= 'abstract'
                    {
                    lv_isAbstract_0_0=(Token)match(input,19,FollowSets000.FOLLOW_78); 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,23,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());

            }
            // InternalOCLinEcore.g:4252:1: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:4253:1: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:4253:1: (lv_name_2_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:4254:3: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_79);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:4270:2: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==54||LA119_0==81) ) {
                alt119=1;
            }
            switch (alt119) {
                case 1 :
                    // InternalOCLinEcore.g:4271:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalOCLinEcore.g:4271:1: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalOCLinEcore.g:4272:3: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_80);
                    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.oclinecore.OCLinEcore.TemplateSignatureCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalOCLinEcore.g:4288:3: (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==30) ) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // InternalOCLinEcore.g:4288:5: otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_4=(Token)match(input,30,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());

                    }
                    // InternalOCLinEcore.g:4292:1: ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) )
                    // InternalOCLinEcore.g:4293:1: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:4293:1: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    // InternalOCLinEcore.g:4294:3: lv_ownedSuperTypes_5_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_81);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:4310:2: (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    loop120:
                    do {
                        int alt120=2;
                        int LA120_0 = input.LA(1);

                        if ( (LA120_0==59) ) {
                            alt120=1;
                        }


                        switch (alt120) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:4310:4: otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_6=(Token)match(input,59,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_6, grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:4314:1: ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    // InternalOCLinEcore.g:4315:1: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    {
                    	    // InternalOCLinEcore.g:4315:1: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    // InternalOCLinEcore.g:4316:3: lv_ownedSuperTypes_7_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_81);
                    	    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalOCLinEcore.g:4332:6: (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt122=2;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==56) ) {
                alt122=1;
            }
            switch (alt122) {
                case 1 :
                    // InternalOCLinEcore.g:4332:8: otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,56,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_8, grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());

                    }
                    // InternalOCLinEcore.g:4336:1: ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalOCLinEcore.g:4337:1: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:4337:1: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:4338:3: lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_22); 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;

            }

            // InternalOCLinEcore.g:4354:4: (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )?
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==60) ) {
                int LA124_1 = input.LA(2);

                if ( (LA124_1==61) ) {
                    int LA124_3 = input.LA(3);

                    if ( (LA124_3==57||LA124_3==60) ) {
                        alt124=1;
                    }
                }
                else if ( (LA124_1==34) ) {
                    alt124=1;
                }
            }
            switch (alt124) {
                case 1 :
                    // InternalOCLinEcore.g:4354:6: otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}'
                    {
                    otherlv_10=(Token)match(input,60,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_10, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalOCLinEcore.g:4358:1: ( (lv_isInterface_11_0= 'interface' ) )?
                    int alt123=2;
                    int LA123_0 = input.LA(1);

                    if ( (LA123_0==34) ) {
                        alt123=1;
                    }
                    switch (alt123) {
                        case 1 :
                            // InternalOCLinEcore.g:4359:1: (lv_isInterface_11_0= 'interface' )
                            {
                            // InternalOCLinEcore.g:4359:1: (lv_isInterface_11_0= 'interface' )
                            // InternalOCLinEcore.g:4360:3: lv_isInterface_11_0= 'interface'
                            {
                            lv_isInterface_11_0=(Token)match(input,34,FollowSets000.FOLLOW_40); 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,61,FollowSets000.FOLLOW_22); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_12, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:4377:3: ( (otherlv_13= '{' ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' ) | otherlv_19= ';' )
            int alt126=2;
            int LA126_0 = input.LA(1);

            if ( (LA126_0==60) ) {
                alt126=1;
            }
            else if ( (LA126_0==57) ) {
                alt126=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 126, 0, input);

                throw nvae;
            }
            switch (alt126) {
                case 1 :
                    // InternalOCLinEcore.g:4377:4: (otherlv_13= '{' ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' )
                    {
                    // InternalOCLinEcore.g:4377:4: (otherlv_13= '{' ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}' )
                    // InternalOCLinEcore.g:4377:6: otherlv_13= '{' ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )* otherlv_18= '}'
                    {
                    otherlv_13=(Token)match(input,60,FollowSets000.FOLLOW_46); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_13, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalOCLinEcore.g:4381:1: ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )*
                    loop125:
                    do {
                        int alt125=5;
                        alt125 = dfa125.predict(input);
                        switch (alt125) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:4381:2: ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:4381:2: ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) )
                    	    // InternalOCLinEcore.g:4382:1: (lv_ownedAnnotations_14_0= ruleAnnotationElementCS )
                    	    {
                    	    // InternalOCLinEcore.g:4382:1: (lv_ownedAnnotations_14_0= ruleAnnotationElementCS )
                    	    // InternalOCLinEcore.g:4383:3: lv_ownedAnnotations_14_0= ruleAnnotationElementCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedAnnotations_14_0=ruleAnnotationElementCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedAnnotations",
                    	              		lv_ownedAnnotations_14_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.AnnotationElementCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalOCLinEcore.g:4400:6: ( (lv_ownedOperations_15_0= ruleOperationCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:4400:6: ( (lv_ownedOperations_15_0= ruleOperationCS ) )
                    	    // InternalOCLinEcore.g:4401:1: (lv_ownedOperations_15_0= ruleOperationCS )
                    	    {
                    	    // InternalOCLinEcore.g:4401:1: (lv_ownedOperations_15_0= ruleOperationCS )
                    	    // InternalOCLinEcore.g:4402:3: lv_ownedOperations_15_0= ruleOperationCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedOperations_15_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_15_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.OperationCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 3 :
                    	    // InternalOCLinEcore.g:4419:6: ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:4419:6: ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) )
                    	    // InternalOCLinEcore.g:4420:1: (lv_ownedProperties_16_0= ruleStructuralFeatureCS )
                    	    {
                    	    // InternalOCLinEcore.g:4420:1: (lv_ownedProperties_16_0= ruleStructuralFeatureCS )
                    	    // InternalOCLinEcore.g:4421:3: lv_ownedProperties_16_0= ruleStructuralFeatureCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_2_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedProperties_16_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_16_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.StructuralFeatureCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 4 :
                    	    // InternalOCLinEcore.g:4438:6: ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:4438:6: ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) )
                    	    // InternalOCLinEcore.g:4439:1: (lv_ownedConstraints_17_0= ruleInvariantConstraintCS )
                    	    {
                    	    // InternalOCLinEcore.g:4439:1: (lv_ownedConstraints_17_0= ruleInvariantConstraintCS )
                    	    // InternalOCLinEcore.g:4440:3: lv_ownedConstraints_17_0= ruleInvariantConstraintCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_7_0_1_3_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_46);
                    	    lv_ownedConstraints_17_0=ruleInvariantConstraintCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedConstraints",
                    	              		lv_ownedConstraints_17_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.InvariantConstraintCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_18, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4461:7: otherlv_19= ';'
                    {
                    otherlv_19=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_19, 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 "entryRuleStructuralFeatureCS"
    // InternalOCLinEcore.g:4473:1: entryRuleStructuralFeatureCS returns [EObject current=null] : iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF ;
    public final EObject entryRuleStructuralFeatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuralFeatureCS = null;


        try {
            // InternalOCLinEcore.g:4474:2: (iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF )
            // InternalOCLinEcore.g:4475: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"
    // InternalOCLinEcore.g:4482: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 {
            // InternalOCLinEcore.g:4485:28: ( (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS ) )
            // InternalOCLinEcore.g:4486:1: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            {
            // InternalOCLinEcore.g:4486:1: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            int alt127=2;
            switch ( input.LA(1) ) {
            case 47:
                {
                switch ( input.LA(2) ) {
                case 26:
                    {
                    int LA127_5 = input.LA(3);

                    if ( (LA127_5==20) ) {
                        alt127=1;
                    }
                    else if ( (LA127_5==43) ) {
                        alt127=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 127, 5, input);

                        throw nvae;
                    }
                    }
                    break;
                case 43:
                    {
                    alt127=2;
                    }
                    break;
                case 20:
                    {
                    alt127=1;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 127, 1, input);

                    throw nvae;
                }

                }
                break;
            case 26:
                {
                switch ( input.LA(2) ) {
                case 47:
                    {
                    int LA127_6 = input.LA(3);

                    if ( (LA127_6==43) ) {
                        alt127=2;
                    }
                    else if ( (LA127_6==20) ) {
                        alt127=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 127, 6, input);

                        throw nvae;
                    }
                    }
                    break;
                case 20:
                    {
                    alt127=1;
                    }
                    break;
                case 43:
                    {
                    alt127=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 127, 2, input);

                    throw nvae;
                }

                }
                break;
            case 20:
                {
                alt127=1;
                }
                break;
            case 43:
                {
                alt127=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 127, 0, input);

                throw nvae;
            }

            switch (alt127) {
                case 1 :
                    // InternalOCLinEcore.g:4487: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 :
                    // InternalOCLinEcore.g:4500: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 "entryRuleSysMLCS"
    // InternalOCLinEcore.g:4519:1: entryRuleSysMLCS returns [EObject current=null] : iv_ruleSysMLCS= ruleSysMLCS EOF ;
    public final EObject entryRuleSysMLCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSysMLCS = null;


        try {
            // InternalOCLinEcore.g:4520:2: (iv_ruleSysMLCS= ruleSysMLCS EOF )
            // InternalOCLinEcore.g:4521:2: iv_ruleSysMLCS= ruleSysMLCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSysMLCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSysMLCS=ruleSysMLCS();

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

            }

        }

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


    // $ANTLR start "ruleSysMLCS"
    // InternalOCLinEcore.g:4528:1: ruleSysMLCS returns [EObject current=null] : ( () otherlv_1= 'sysml' ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) ) ) ;
    public final EObject ruleSysMLCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        EObject lv_ownedDetails_2_0 = null;

        EObject lv_ownedDetails_5_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:4531:28: ( ( () otherlv_1= 'sysml' ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) ) ) )
            // InternalOCLinEcore.g:4532:1: ( () otherlv_1= 'sysml' ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) ) )
            {
            // InternalOCLinEcore.g:4532:1: ( () otherlv_1= 'sysml' ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) ) )
            // InternalOCLinEcore.g:4532:2: () otherlv_1= 'sysml' ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) )
            {
            // InternalOCLinEcore.g:4532:2: ()
            // InternalOCLinEcore.g:4533:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getSysMLCSAccess().getSysMLCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getSysMLCSAccess().getSysmlKeyword_1());

            }
            // InternalOCLinEcore.g:4545:1: ( ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' ) | (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' ) )
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==RULE_SINGLE_QUOTED_STRING||(LA129_0>=RULE_SIMPLE_ID && LA129_0<=RULE_ESCAPED_ID)||LA129_0==17||(LA129_0>=19 && LA129_0<=53)||LA129_0==58||LA129_0==71||(LA129_0>=73 && LA129_0<=74)||LA129_0==76||LA129_0==80) ) {
                alt129=1;
            }
            else if ( (LA129_0==60) ) {
                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 :
                    // InternalOCLinEcore.g:4545:2: ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' )
                    {
                    // InternalOCLinEcore.g:4545:2: ( ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';' )
                    // InternalOCLinEcore.g:4545:3: ( (lv_ownedDetails_2_0= ruleDetailCS ) ) otherlv_3= ';'
                    {
                    // InternalOCLinEcore.g:4545:3: ( (lv_ownedDetails_2_0= ruleDetailCS ) )
                    // InternalOCLinEcore.g:4546:1: (lv_ownedDetails_2_0= ruleDetailCS )
                    {
                    // InternalOCLinEcore.g:4546:1: (lv_ownedDetails_2_0= ruleDetailCS )
                    // InternalOCLinEcore.g:4547:3: lv_ownedDetails_2_0= ruleDetailCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_14);
                    lv_ownedDetails_2_0=ruleDetailCS();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getSysMLCSRule());
                      	        }
                             		add(
                             			current,
                             			"ownedDetails",
                              		lv_ownedDetails_2_0,
                              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_3, grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_0_1());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4568:6: (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' )
                    {
                    // InternalOCLinEcore.g:4568:6: (otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}' )
                    // InternalOCLinEcore.g:4568:8: otherlv_4= '{' ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )* otherlv_7= '}'
                    {
                    otherlv_4=(Token)match(input,60,FollowSets000.FOLLOW_84); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getSysMLCSAccess().getLeftCurlyBracketKeyword_2_1_0());

                    }
                    // InternalOCLinEcore.g:4572:1: ( ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';' )*
                    loop128:
                    do {
                        int alt128=2;
                        int LA128_0 = input.LA(1);

                        if ( (LA128_0==RULE_SINGLE_QUOTED_STRING||(LA128_0>=RULE_SIMPLE_ID && LA128_0<=RULE_ESCAPED_ID)||LA128_0==17||(LA128_0>=19 && LA128_0<=53)||LA128_0==58||LA128_0==71||(LA128_0>=73 && LA128_0<=74)||LA128_0==76||LA128_0==80) ) {
                            alt128=1;
                        }


                        switch (alt128) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:4572:2: ( (lv_ownedDetails_5_0= ruleDetailCS ) ) otherlv_6= ';'
                    	    {
                    	    // InternalOCLinEcore.g:4572:2: ( (lv_ownedDetails_5_0= ruleDetailCS ) )
                    	    // InternalOCLinEcore.g:4573:1: (lv_ownedDetails_5_0= ruleDetailCS )
                    	    {
                    	    // InternalOCLinEcore.g:4573:1: (lv_ownedDetails_5_0= ruleDetailCS )
                    	    // InternalOCLinEcore.g:4574:3: lv_ownedDetails_5_0= ruleDetailCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_1_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_14);
                    	    lv_ownedDetails_5_0=ruleDetailCS();

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

                    	      	        if (current==null) {
                    	      	            current = createModelElementForParent(grammarAccess.getSysMLCSRule());
                    	      	        }
                    	             		add(
                    	             			current,
                    	             			"ownedDetails",
                    	              		lv_ownedDetails_5_0,
                    	              		"org.eclipse.ocl.xtext.oclinecore.OCLinEcore.DetailCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }

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

                    	          	newLeafNode(otherlv_6, grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_1_1_1());

                    	    }

                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_7, grammarAccess.getSysMLCSAccess().getRightCurlyBracketKeyword_2_1_2());

                    }

                    }


                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleTypedMultiplicityRefCS"
    // InternalOCLinEcore.g:4608:1: entryRuleTypedMultiplicityRefCS returns [EObject current=null] : iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF ;
    public final EObject entryRuleTypedMultiplicityRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedMultiplicityRefCS = null;


        try {
            // InternalOCLinEcore.g:4609:2: (iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF )
            // InternalOCLinEcore.g:4610: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"
    // InternalOCLinEcore.g:4617: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 {
            // InternalOCLinEcore.g:4620:28: ( (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalOCLinEcore.g:4621:1: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalOCLinEcore.g:4621:1: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalOCLinEcore.g:4622: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_85);
            this_TypedRefCS_0=ruleTypedRefCS();

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

                      current = this_TypedRefCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalOCLinEcore.g:4633:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==124) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalOCLinEcore.g:4634:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalOCLinEcore.g:4634:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalOCLinEcore.g:4635: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 "entryRuleTemplateSignatureCS"
    // InternalOCLinEcore.g:4659:1: entryRuleTemplateSignatureCS returns [EObject current=null] : iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF ;
    public final EObject entryRuleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateSignatureCS = null;


        try {
            // InternalOCLinEcore.g:4660:2: (iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF )
            // InternalOCLinEcore.g:4661: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"
    // InternalOCLinEcore.g:4668:1: ruleTemplateSignatureCS returns [EObject current=null] : ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) | (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' ) ) ;
    public final EObject ruleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        EObject lv_ownedParameters_1_0 = null;

        EObject lv_ownedParameters_3_0 = null;

        EObject lv_ownedParameters_6_0 = null;

        EObject lv_ownedParameters_8_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:4671:28: ( ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) | (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' ) ) )
            // InternalOCLinEcore.g:4672:1: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) | (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' ) )
            {
            // InternalOCLinEcore.g:4672:1: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) | (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' ) )
            int alt133=2;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==54) ) {
                alt133=1;
            }
            else if ( (LA133_0==81) ) {
                alt133=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 133, 0, input);

                throw nvae;
            }
            switch (alt133) {
                case 1 :
                    // InternalOCLinEcore.g:4672:2: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
                    {
                    // InternalOCLinEcore.g:4672:2: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
                    // InternalOCLinEcore.g:4672:4: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,54,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_0, grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());

                    }
                    // InternalOCLinEcore.g:4676:1: ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) )
                    // InternalOCLinEcore.g:4677:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
                    {
                    // InternalOCLinEcore.g:4677:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
                    // InternalOCLinEcore.g:4678:3: lv_ownedParameters_1_0= ruleTypeParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_21);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:4694:2: (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )*
                    loop131:
                    do {
                        int alt131=2;
                        int LA131_0 = input.LA(1);

                        if ( (LA131_0==59) ) {
                            alt131=1;
                        }


                        switch (alt131) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:4694:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
                    	    {
                    	    otherlv_2=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

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

                    	    }
                    	    // InternalOCLinEcore.g:4698:1: ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
                    	    // InternalOCLinEcore.g:4699:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
                    	    {
                    	    // InternalOCLinEcore.g:4699:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
                    	    // InternalOCLinEcore.g:4700:3: lv_ownedParameters_3_0= ruleTypeParameterCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_21);
                    	    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 loop131;
                        }
                    } while (true);

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

                          	newLeafNode(otherlv_4, grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4721:6: (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' )
                    {
                    // InternalOCLinEcore.g:4721:6: (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' )
                    // InternalOCLinEcore.g:4721:8: otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>'
                    {
                    otherlv_5=(Token)match(input,81,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:4725:1: ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) )
                    // InternalOCLinEcore.g:4726:1: (lv_ownedParameters_6_0= ruleTypeParameterCS )
                    {
                    // InternalOCLinEcore.g:4726:1: (lv_ownedParameters_6_0= ruleTypeParameterCS )
                    // InternalOCLinEcore.g:4727:3: lv_ownedParameters_6_0= ruleTypeParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_86);
                    lv_ownedParameters_6_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_6_0,
                              		"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:4743:2: (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )*
                    loop132:
                    do {
                        int alt132=2;
                        int LA132_0 = input.LA(1);

                        if ( (LA132_0==59) ) {
                            alt132=1;
                        }


                        switch (alt132) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:4743:4: otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) )
                    	    {
                    	    otherlv_7=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_7, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:4747:1: ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) )
                    	    // InternalOCLinEcore.g:4748:1: (lv_ownedParameters_8_0= ruleTypeParameterCS )
                    	    {
                    	    // InternalOCLinEcore.g:4748:1: (lv_ownedParameters_8_0= ruleTypeParameterCS )
                    	    // InternalOCLinEcore.g:4749:3: lv_ownedParameters_8_0= ruleTypeParameterCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_86);
                    	    lv_ownedParameters_8_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_8_0,
                    	              		"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                          	newLeafNode(otherlv_9, grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());

                    }

                    }


                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleTypedRefCS"
    // InternalOCLinEcore.g:4777:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
    public final EObject entryRuleTypedRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedRefCS = null;


        try {
            // InternalOCLinEcore.g:4778:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
            // InternalOCLinEcore.g:4779: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"
    // InternalOCLinEcore.g:4786: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 {
            // InternalOCLinEcore.g:4789:28: ( (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS ) )
            // InternalOCLinEcore.g:4790:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS )
            {
            // InternalOCLinEcore.g:4790:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS | this_TypedTypeRefCS_1= ruleTypedTypeRefCS )
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( ((LA134_0>=98 && LA134_0<=99)||(LA134_0>=101 && LA134_0<=113)) ) {
                alt134=1;
            }
            else if ( ((LA134_0>=RULE_SIMPLE_ID && LA134_0<=RULE_ESCAPED_ID)||LA134_0==17||(LA134_0>=19 && LA134_0<=53)||LA134_0==58||LA134_0==71||(LA134_0>=73 && LA134_0<=74)||LA134_0==76||LA134_0==80) ) {
                alt134=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 134, 0, input);

                throw nvae;
            }
            switch (alt134) {
                case 1 :
                    // InternalOCLinEcore.g:4791: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 :
                    // InternalOCLinEcore.g:4804: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 "entryRuleTypedTypeRefCS"
    // InternalOCLinEcore.g:4823:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
    public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedTypeRefCS = null;


        try {
            // InternalOCLinEcore.g:4824:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
            // InternalOCLinEcore.g:4825: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"
    // InternalOCLinEcore.g:4832:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )? ) ;
    public final EObject ruleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedBinding_2_0 = null;

        EObject lv_ownedBinding_5_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:4835:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )? ) )
            // InternalOCLinEcore.g:4836:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )? )
            {
            // InternalOCLinEcore.g:4836:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )? )
            // InternalOCLinEcore.g:4836:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )?
            {
            // InternalOCLinEcore.g:4836:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalOCLinEcore.g:4837:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalOCLinEcore.g:4837:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalOCLinEcore.g:4838:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_87);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:4854:2: ( (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' ) | (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' ) )?
            int alt135=3;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==54) ) {
                alt135=1;
            }
            else if ( (LA135_0==81) ) {
                alt135=2;
            }
            switch (alt135) {
                case 1 :
                    // InternalOCLinEcore.g:4854:3: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )
                    {
                    // InternalOCLinEcore.g:4854:3: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )
                    // InternalOCLinEcore.g:4854:5: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
                    {
                    otherlv_1=(Token)match(input,54,FollowSets000.FOLLOW_88); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0_0());

                    }
                    // InternalOCLinEcore.g:4858:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
                    // InternalOCLinEcore.g:4859:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                    {
                    // InternalOCLinEcore.g:4859:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                    // InternalOCLinEcore.g:4860:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    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,55,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4881:6: (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' )
                    {
                    // InternalOCLinEcore.g:4881:6: (otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>' )
                    // InternalOCLinEcore.g:4881:8: otherlv_4= '<' ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) ) otherlv_6= '>'
                    {
                    otherlv_4=(Token)match(input,81,FollowSets000.FOLLOW_88); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_4, grammarAccess.getTypedTypeRefCSAccess().getLessThanSignKeyword_1_1_0());

                    }
                    // InternalOCLinEcore.g:4885:1: ( (lv_ownedBinding_5_0= ruleTemplateBindingCS ) )
                    // InternalOCLinEcore.g:4886:1: (lv_ownedBinding_5_0= ruleTemplateBindingCS )
                    {
                    // InternalOCLinEcore.g:4886:1: (lv_ownedBinding_5_0= ruleTemplateBindingCS )
                    // InternalOCLinEcore.g:4887:3: lv_ownedBinding_5_0= ruleTemplateBindingCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_89);
                    lv_ownedBinding_5_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_5_0,
                              		"org.eclipse.ocl.xtext.base.Base.TemplateBindingCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_6, grammarAccess.getTypedTypeRefCSAccess().getGreaterThanSignKeyword_1_1_2());

                    }

                    }


                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleUnrestrictedName"
    // InternalOCLinEcore.g:4915:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
    public final String entryRuleUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnrestrictedName = null;


        try {
            // InternalOCLinEcore.g:4916:2: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
            // InternalOCLinEcore.g:4917: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"
    // InternalOCLinEcore.g:4924:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_EnumerationLiteralName_0= ruleEnumerationLiteralName | kw= 'annotation' | kw= 'documentation' | kw= 'invariant' | kw= 'literal' | kw= 'opposite' | kw= 'serializable' | kw= 'sysml' ) ;
    public final AntlrDatatypeRuleToken ruleUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_EnumerationLiteralName_0 = null;


         enterRule();

        try {
            // InternalOCLinEcore.g:4927:28: ( (this_EnumerationLiteralName_0= ruleEnumerationLiteralName | kw= 'annotation' | kw= 'documentation' | kw= 'invariant' | kw= 'literal' | kw= 'opposite' | kw= 'serializable' | kw= 'sysml' ) )
            // InternalOCLinEcore.g:4928:1: (this_EnumerationLiteralName_0= ruleEnumerationLiteralName | kw= 'annotation' | kw= 'documentation' | kw= 'invariant' | kw= 'literal' | kw= 'opposite' | kw= 'serializable' | kw= 'sysml' )
            {
            // InternalOCLinEcore.g:4928:1: (this_EnumerationLiteralName_0= ruleEnumerationLiteralName | kw= 'annotation' | kw= 'documentation' | kw= 'invariant' | kw= 'literal' | kw= 'opposite' | kw= 'serializable' | kw= 'sysml' )
            int alt136=8;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
            case 33:
            case 34:
            case 35:
            case 36:
            case 37:
            case 38:
            case 39:
            case 40:
            case 41:
            case 42:
            case 43:
            case 44:
            case 45:
            case 46:
            case 47:
            case 48:
            case 49:
            case 50:
            case 51:
            case 52:
                {
                alt136=1;
                }
                break;
            case 58:
                {
                alt136=2;
                }
                break;
            case 73:
                {
                alt136=3;
                }
                break;
            case 53:
                {
                alt136=4;
                }
                break;
            case 74:
                {
                alt136=5;
                }
                break;
            case 76:
                {
                alt136=6;
                }
                break;
            case 71:
                {
                alt136=7;
                }
                break;
            case 80:
                {
                alt136=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 136, 0, input);

                throw nvae;
            }

            switch (alt136) {
                case 1 :
                    // InternalOCLinEcore.g:4929:5: this_EnumerationLiteralName_0= ruleEnumerationLiteralName
                    {
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getEnumerationLiteralNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnumerationLiteralName_0=ruleEnumerationLiteralName();

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

                      		current.merge(this_EnumerationLiteralName_0);

                    }
                    if ( state.backtracking==0 ) {

                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4941:2: kw= 'annotation'
                    {
                    kw=(Token)match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getAnnotationKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4948:2: kw= 'documentation'
                    {
                    kw=(Token)match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getDocumentationKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4955:2: kw= 'invariant'
                    {
                    kw=(Token)match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getInvariantKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4962:2: kw= 'literal'
                    {
                    kw=(Token)match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getLiteralKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4969:2: kw= 'opposite'
                    {
                    kw=(Token)match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getOppositeKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4976:2: kw= 'serializable'
                    {
                    kw=(Token)match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4983:2: kw= 'sysml'
                    {
                    kw=(Token)match(input,80,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_7());

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleEssentialOCLUnaryOperatorName"
    // InternalOCLinEcore.g:5000:1: entryRuleEssentialOCLUnaryOperatorName returns [String current=null] : iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF ;
    public final String entryRuleEssentialOCLUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnaryOperatorName = null;


        try {
            // InternalOCLinEcore.g:5001:2: (iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF )
            // InternalOCLinEcore.g:5002: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"
    // InternalOCLinEcore.g:5009:1: ruleEssentialOCLUnaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '-' | kw= 'not' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:5012:28: ( (kw= '-' | kw= 'not' ) )
            // InternalOCLinEcore.g:5013:1: (kw= '-' | kw= 'not' )
            {
            // InternalOCLinEcore.g:5013:1: (kw= '-' | kw= 'not' )
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==18) ) {
                alt137=1;
            }
            else if ( (LA137_0==83) ) {
                alt137=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 137, 0, input);

                throw nvae;
            }
            switch (alt137) {
                case 1 :
                    // InternalOCLinEcore.g:5014:2: kw= '-'
                    {
                    kw=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5021:2: kw= 'not'
                    {
                    kw=(Token)match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleEssentialOCLInfixOperatorName"
    // InternalOCLinEcore.g:5034:1: entryRuleEssentialOCLInfixOperatorName returns [String current=null] : iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF ;
    public final String entryRuleEssentialOCLInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLInfixOperatorName = null;


        try {
            // InternalOCLinEcore.g:5035:2: (iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF )
            // InternalOCLinEcore.g:5036: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"
    // InternalOCLinEcore.g:5043:1: ruleEssentialOCLInfixOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'or' | kw= 'xor' | kw= 'implies' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLInfixOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:5046:28: ( (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'or' | kw= 'xor' | kw= 'implies' ) )
            // InternalOCLinEcore.g:5047:1: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'or' | kw= 'xor' | kw= 'implies' )
            {
            // InternalOCLinEcore.g:5047:1: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'or' | kw= 'xor' | kw= 'implies' )
            int alt138=14;
            switch ( input.LA(1) ) {
            case 84:
                {
                alt138=1;
                }
                break;
            case 85:
                {
                alt138=2;
                }
                break;
            case 86:
                {
                alt138=3;
                }
                break;
            case 18:
                {
                alt138=4;
                }
                break;
            case 82:
                {
                alt138=5;
                }
                break;
            case 81:
                {
                alt138=6;
                }
                break;
            case 87:
                {
                alt138=7;
                }
                break;
            case 88:
                {
                alt138=8;
                }
                break;
            case 62:
                {
                alt138=9;
                }
                break;
            case 89:
                {
                alt138=10;
                }
                break;
            case 90:
                {
                alt138=11;
                }
                break;
            case 91:
                {
                alt138=12;
                }
                break;
            case 92:
                {
                alt138=13;
                }
                break;
            case 93:
                {
                alt138=14;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 138, 0, input);

                throw nvae;
            }

            switch (alt138) {
                case 1 :
                    // InternalOCLinEcore.g:5048:2: kw= '*'
                    {
                    kw=(Token)match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5055:2: kw= '/'
                    {
                    kw=(Token)match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5062:2: kw= '+'
                    {
                    kw=(Token)match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5069:2: kw= '-'
                    {
                    kw=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5076:2: kw= '>'
                    {
                    kw=(Token)match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5083:2: kw= '<'
                    {
                    kw=(Token)match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:5090:2: kw= '>='
                    {
                    kw=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:5097:2: kw= '<='
                    {
                    kw=(Token)match(input,88,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:5104:2: kw= '='
                    {
                    kw=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:5111:2: kw= '<>'
                    {
                    kw=(Token)match(input,89,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:5118:2: kw= 'and'
                    {
                    kw=(Token)match(input,90,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:5125:2: kw= 'or'
                    {
                    kw=(Token)match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:5132:2: kw= 'xor'
                    {
                    kw=(Token)match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:5139:2: kw= 'implies'
                    {
                    kw=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_13());

                    }

                    }
                    break;

            }


            }

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

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


    // $ANTLR start "entryRuleEssentialOCLNavigationOperatorName"
    // InternalOCLinEcore.g:5152:1: entryRuleEssentialOCLNavigationOperatorName returns [String current=null] : iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF ;
    public final String entryRuleEssentialOCLNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLNavigationOperatorName = null;


        try {
            // InternalOCLinEcore.g:5153:2: (iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF )
            // InternalOCLinEcore.g:5154: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"
    // InternalOCLinEcore.g:5161: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 {
            // InternalOCLinEcore.g:5164:28: ( (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' ) )
            // InternalOCLinEcore.g:5165:1: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            {
            // InternalOCLinEcore.g:5165:1: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            int alt139=4;
            switch ( input.LA(1) ) {
            case 94:
                {
                alt139=1;
                }
                break;
            case 95:
                {
                alt139=2;
                }
                break;
            case 96:
                {
                alt139=3;
                }
                break;
            case 97:
                {
                alt139=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 139, 0, input);

                throw nvae;
            }

            switch (alt139) {
                case 1 :
                    // InternalOCLinEcore.g:5166:2: kw= '.'
                    {
                    kw=(Token)match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5173:2: kw= '->'
                    {
                    kw=(Token)match(input,95,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5180:2: kw= '?.'
                    {
                    kw=(Token)match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5187:2: kw= '?->'
                    {
                    kw=(Token)match(input,97,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"
    // InternalOCLinEcore.g:5200:1: entryRuleBinaryOperatorName returns [String current=null] : iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF ;
    public final String entryRuleBinaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleBinaryOperatorName = null;


        try {
            // InternalOCLinEcore.g:5201:2: (iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF )
            // InternalOCLinEcore.g:5202: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"
    // InternalOCLinEcore.g:5209: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 {
            // InternalOCLinEcore.g:5212:28: ( (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName ) )
            // InternalOCLinEcore.g:5213:1: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            {
            // InternalOCLinEcore.g:5213:1: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==18||LA140_0==62||(LA140_0>=81 && LA140_0<=82)||(LA140_0>=84 && LA140_0<=93)) ) {
                alt140=1;
            }
            else if ( ((LA140_0>=94 && LA140_0<=97)) ) {
                alt140=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 140, 0, input);

                throw nvae;
            }
            switch (alt140) {
                case 1 :
                    // InternalOCLinEcore.g:5214: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 :
                    // InternalOCLinEcore.g:5226: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"
    // InternalOCLinEcore.g:5244:1: entryRuleInfixOperatorName returns [String current=null] : iv_ruleInfixOperatorName= ruleInfixOperatorName EOF ;
    public final String entryRuleInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleInfixOperatorName = null;


        try {
            // InternalOCLinEcore.g:5245:2: (iv_ruleInfixOperatorName= ruleInfixOperatorName EOF )
            // InternalOCLinEcore.g:5246: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"
    // InternalOCLinEcore.g:5253: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 {
            // InternalOCLinEcore.g:5256:28: (this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName )
            // InternalOCLinEcore.g:5258: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"
    // InternalOCLinEcore.g:5276:1: entryRuleNavigationOperatorName returns [String current=null] : iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF ;
    public final String entryRuleNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNavigationOperatorName = null;


        try {
            // InternalOCLinEcore.g:5277:2: (iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF )
            // InternalOCLinEcore.g:5278: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"
    // InternalOCLinEcore.g:5285: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 {
            // InternalOCLinEcore.g:5288:28: (this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName )
            // InternalOCLinEcore.g:5290: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"
    // InternalOCLinEcore.g:5308:1: entryRuleUnaryOperatorName returns [String current=null] : iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF ;
    public final String entryRuleUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnaryOperatorName = null;


        try {
            // InternalOCLinEcore.g:5309:2: (iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF )
            // InternalOCLinEcore.g:5310: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"
    // InternalOCLinEcore.g:5317: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 {
            // InternalOCLinEcore.g:5320:28: (this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName )
            // InternalOCLinEcore.g:5322: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"
    // InternalOCLinEcore.g:5340:1: entryRuleEssentialOCLUnrestrictedName returns [String current=null] : iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF ;
    public final String entryRuleEssentialOCLUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnrestrictedName = null;


        try {
            // InternalOCLinEcore.g:5341:2: (iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF )
            // InternalOCLinEcore.g:5342: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"
    // InternalOCLinEcore.g:5349: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 {
            // InternalOCLinEcore.g:5352:28: (this_Identifier_0= ruleIdentifier )
            // InternalOCLinEcore.g:5354: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"
    // InternalOCLinEcore.g:5372:1: entryRuleEssentialOCLUnreservedName returns [String current=null] : iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF ;
    public final String entryRuleEssentialOCLUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnreservedName = null;


        try {
            // InternalOCLinEcore.g:5373:2: (iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF )
            // InternalOCLinEcore.g:5374: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"
    // InternalOCLinEcore.g:5381: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 {
            // InternalOCLinEcore.g:5384:28: ( (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' ) )
            // InternalOCLinEcore.g:5385:1: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            {
            // InternalOCLinEcore.g:5385:1: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            int alt141=5;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
            case 33:
            case 34:
            case 35:
            case 36:
            case 37:
            case 38:
            case 39:
            case 40:
            case 41:
            case 42:
            case 43:
            case 44:
            case 45:
            case 46:
            case 47:
            case 48:
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 58:
            case 71:
            case 73:
            case 74:
            case 76:
            case 80:
                {
                alt141=1;
                }
                break;
            case 109:
            case 110:
            case 111:
            case 112:
            case 113:
                {
                alt141=2;
                }
                break;
            case 101:
            case 102:
            case 103:
            case 104:
            case 105:
            case 106:
            case 107:
            case 108:
                {
                alt141=3;
                }
                break;
            case 98:
                {
                alt141=4;
                }
                break;
            case 99:
                {
                alt141=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 141, 0, input);

                throw nvae;
            }

            switch (alt141) {
                case 1 :
                    // InternalOCLinEcore.g:5386: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 :
                    // InternalOCLinEcore.g:5398: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 :
                    // InternalOCLinEcore.g:5410: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 :
                    // InternalOCLinEcore.g:5422:2: kw= 'Map'
                    {
                    kw=(Token)match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5429:2: kw= 'Tuple'
                    {
                    kw=(Token)match(input,99,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"
    // InternalOCLinEcore.g:5442:1: entryRuleUnreservedName returns [String current=null] : iv_ruleUnreservedName= ruleUnreservedName EOF ;
    public final String entryRuleUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnreservedName = null;


        try {
            // InternalOCLinEcore.g:5443:2: (iv_ruleUnreservedName= ruleUnreservedName EOF )
            // InternalOCLinEcore.g:5444: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"
    // InternalOCLinEcore.g:5451: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 {
            // InternalOCLinEcore.g:5454:28: (this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName )
            // InternalOCLinEcore.g:5456: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"
    // InternalOCLinEcore.g:5474:1: entryRuleURIPathNameCS returns [EObject current=null] : iv_ruleURIPathNameCS= ruleURIPathNameCS EOF ;
    public final EObject entryRuleURIPathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIPathNameCS = null;


        try {
            // InternalOCLinEcore.g:5475:2: (iv_ruleURIPathNameCS= ruleURIPathNameCS EOF )
            // InternalOCLinEcore.g:5476: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"
    // InternalOCLinEcore.g:5483: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 {
            // InternalOCLinEcore.g:5486:28: ( ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalOCLinEcore.g:5487:1: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalOCLinEcore.g:5487:1: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalOCLinEcore.g:5487:2: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalOCLinEcore.g:5487:2: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) )
            // InternalOCLinEcore.g:5488:1: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            {
            // InternalOCLinEcore.g:5488:1: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            // InternalOCLinEcore.g:5489:3: lv_ownedPathElements_0_0= ruleURIFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_90);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:5505:2: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop142:
            do {
                int alt142=2;
                int LA142_0 = input.LA(1);

                if ( (LA142_0==100) ) {
                    alt142=1;
                }


                switch (alt142) {
            	case 1 :
            	    // InternalOCLinEcore.g:5505:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,100,FollowSets000.FOLLOW_91); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalOCLinEcore.g:5509:1: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalOCLinEcore.g:5510:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalOCLinEcore.g:5510:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalOCLinEcore.g:5511:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_90);
            	    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 loop142;
                }
            } while (true);


            }


            }

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

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


    // $ANTLR start "entryRuleURIFirstPathElementCS"
    // InternalOCLinEcore.g:5535:1: entryRuleURIFirstPathElementCS returns [EObject current=null] : iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF ;
    public final EObject entryRuleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIFirstPathElementCS = null;


        try {
            // InternalOCLinEcore.g:5536:2: (iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF )
            // InternalOCLinEcore.g:5537: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"
    // InternalOCLinEcore.g:5544:1: ruleURIFirstPathElementCS returns [EObject current=null] : ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) ;
    public final EObject ruleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalOCLinEcore.g:5547:28: ( ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) )
            // InternalOCLinEcore.g:5548:1: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            {
            // InternalOCLinEcore.g:5548:1: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( ((LA143_0>=RULE_SIMPLE_ID && LA143_0<=RULE_ESCAPED_ID)||LA143_0==17||(LA143_0>=19 && LA143_0<=53)||LA143_0==58||LA143_0==71||(LA143_0>=73 && LA143_0<=74)||LA143_0==76||LA143_0==80) ) {
                alt143=1;
            }
            else if ( (LA143_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt143=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;
            }
            switch (alt143) {
                case 1 :
                    // InternalOCLinEcore.g:5548:2: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalOCLinEcore.g:5548:2: ( ( ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:5549:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:5549:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:5550: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 :
                    // InternalOCLinEcore.g:5567:6: ( () ( ( ruleURI ) ) )
                    {
                    // InternalOCLinEcore.g:5567:6: ( () ( ( ruleURI ) ) )
                    // InternalOCLinEcore.g:5567:7: () ( ( ruleURI ) )
                    {
                    // InternalOCLinEcore.g:5567:7: ()
                    // InternalOCLinEcore.g:5568:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0(),
                                  current);

                    }

                    }

                    // InternalOCLinEcore.g:5576:2: ( ( ruleURI ) )
                    // InternalOCLinEcore.g:5577:1: ( ruleURI )
                    {
                    // InternalOCLinEcore.g:5577:1: ( ruleURI )
                    // InternalOCLinEcore.g:5578: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"
    // InternalOCLinEcore.g:5604:1: entryRulePrimitiveTypeIdentifier returns [String current=null] : iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF ;
    public final String entryRulePrimitiveTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_rulePrimitiveTypeIdentifier = null;


        try {
            // InternalOCLinEcore.g:5605:2: (iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF )
            // InternalOCLinEcore.g:5606: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"
    // InternalOCLinEcore.g:5613: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 {
            // InternalOCLinEcore.g:5616:28: ( (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' ) )
            // InternalOCLinEcore.g:5617:1: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            {
            // InternalOCLinEcore.g:5617:1: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            int alt144=8;
            switch ( input.LA(1) ) {
            case 101:
                {
                alt144=1;
                }
                break;
            case 102:
                {
                alt144=2;
                }
                break;
            case 103:
                {
                alt144=3;
                }
                break;
            case 104:
                {
                alt144=4;
                }
                break;
            case 105:
                {
                alt144=5;
                }
                break;
            case 106:
                {
                alt144=6;
                }
                break;
            case 107:
                {
                alt144=7;
                }
                break;
            case 108:
                {
                alt144=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 144, 0, input);

                throw nvae;
            }

            switch (alt144) {
                case 1 :
                    // InternalOCLinEcore.g:5618:2: kw= 'Boolean'
                    {
                    kw=(Token)match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5625:2: kw= 'Integer'
                    {
                    kw=(Token)match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5632:2: kw= 'Real'
                    {
                    kw=(Token)match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5639:2: kw= 'String'
                    {
                    kw=(Token)match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5646:2: kw= 'UnlimitedNatural'
                    {
                    kw=(Token)match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5653:2: kw= 'OclAny'
                    {
                    kw=(Token)match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:5660:2: kw= 'OclInvalid'
                    {
                    kw=(Token)match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:5667:2: kw= 'OclVoid'
                    {
                    kw=(Token)match(input,108,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"
    // InternalOCLinEcore.g:5680:1: entryRulePrimitiveTypeCS returns [EObject current=null] : iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF ;
    public final EObject entryRulePrimitiveTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveTypeCS = null;


        try {
            // InternalOCLinEcore.g:5681:2: (iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF )
            // InternalOCLinEcore.g:5682: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"
    // InternalOCLinEcore.g:5689: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 {
            // InternalOCLinEcore.g:5692:28: ( ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) ) )
            // InternalOCLinEcore.g:5693:1: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            {
            // InternalOCLinEcore.g:5693:1: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            // InternalOCLinEcore.g:5694:1: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            {
            // InternalOCLinEcore.g:5694:1: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            // InternalOCLinEcore.g:5695: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"
    // InternalOCLinEcore.g:5719:1: entryRuleCollectionTypeIdentifier returns [String current=null] : iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF ;
    public final String entryRuleCollectionTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleCollectionTypeIdentifier = null;


        try {
            // InternalOCLinEcore.g:5720:2: (iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF )
            // InternalOCLinEcore.g:5721: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"
    // InternalOCLinEcore.g:5728: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 {
            // InternalOCLinEcore.g:5731:28: ( (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' ) )
            // InternalOCLinEcore.g:5732:1: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            {
            // InternalOCLinEcore.g:5732:1: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            int alt145=5;
            switch ( input.LA(1) ) {
            case 109:
                {
                alt145=1;
                }
                break;
            case 110:
                {
                alt145=2;
                }
                break;
            case 111:
                {
                alt145=3;
                }
                break;
            case 112:
                {
                alt145=4;
                }
                break;
            case 113:
                {
                alt145=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 145, 0, input);

                throw nvae;
            }

            switch (alt145) {
                case 1 :
                    // InternalOCLinEcore.g:5733:2: kw= 'Set'
                    {
                    kw=(Token)match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5740:2: kw= 'Bag'
                    {
                    kw=(Token)match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5747:2: kw= 'Sequence'
                    {
                    kw=(Token)match(input,111,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5754:2: kw= 'Collection'
                    {
                    kw=(Token)match(input,112,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                              current.merge(kw);
                              newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5761:2: kw= 'OrderedSet'
                    {
                    kw=(Token)match(input,113,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"
    // InternalOCLinEcore.g:5774:1: entryRuleCollectionTypeCS returns [EObject current=null] : iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF ;
    public final EObject entryRuleCollectionTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionTypeCS = null;


        try {
            // InternalOCLinEcore.g:5775:2: (iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF )
            // InternalOCLinEcore.g:5776: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"
    // InternalOCLinEcore.g:5783: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 {
            // InternalOCLinEcore.g:5786:28: ( ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? ) )
            // InternalOCLinEcore.g:5787:1: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            {
            // InternalOCLinEcore.g:5787:1: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            // InternalOCLinEcore.g:5787:2: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            {
            // InternalOCLinEcore.g:5787:2: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) )
            // InternalOCLinEcore.g:5788:1: (lv_name_0_0= ruleCollectionTypeIdentifier )
            {
            // InternalOCLinEcore.g:5788:1: (lv_name_0_0= ruleCollectionTypeIdentifier )
            // InternalOCLinEcore.g:5789:3: lv_name_0_0= ruleCollectionTypeIdentifier
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_92);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:5805:2: (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==54) ) {
                alt147=1;
            }
            switch (alt147) {
                case 1 :
                    // InternalOCLinEcore.g:5805:4: otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')'
                    {
                    otherlv_1=(Token)match(input,54,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:5809:1: ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) )
                    // InternalOCLinEcore.g:5810:1: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    {
                    // InternalOCLinEcore.g:5810:1: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    // InternalOCLinEcore.g:5811:3: lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_93);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:5827:2: ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )?
                    int alt146=2;
                    int LA146_0 = input.LA(1);

                    if ( (LA146_0==124) ) {
                        alt146=1;
                    }
                    switch (alt146) {
                        case 1 :
                            // InternalOCLinEcore.g:5828:1: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            {
                            // InternalOCLinEcore.g:5828:1: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            // InternalOCLinEcore.g:5829:3: lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            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,55,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"
    // InternalOCLinEcore.g:5857:1: entryRuleMapTypeCS returns [EObject current=null] : iv_ruleMapTypeCS= ruleMapTypeCS EOF ;
    public final EObject entryRuleMapTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapTypeCS = null;


        try {
            // InternalOCLinEcore.g:5858:2: (iv_ruleMapTypeCS= ruleMapTypeCS EOF )
            // InternalOCLinEcore.g:5859: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"
    // InternalOCLinEcore.g:5866: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 {
            // InternalOCLinEcore.g:5869:28: ( ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? ) )
            // InternalOCLinEcore.g:5870:1: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            {
            // InternalOCLinEcore.g:5870:1: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            // InternalOCLinEcore.g:5870:2: ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            {
            // InternalOCLinEcore.g:5870:2: ( (lv_name_0_0= 'Map' ) )
            // InternalOCLinEcore.g:5871:1: (lv_name_0_0= 'Map' )
            {
            // InternalOCLinEcore.g:5871:1: (lv_name_0_0= 'Map' )
            // InternalOCLinEcore.g:5872:3: lv_name_0_0= 'Map'
            {
            lv_name_0_0=(Token)match(input,98,FollowSets000.FOLLOW_92); 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");

            }

            }


            }

            // InternalOCLinEcore.g:5885:2: (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            int alt148=2;
            int LA148_0 = input.LA(1);

            if ( (LA148_0==54) ) {
                alt148=1;
            }
            switch (alt148) {
                case 1 :
                    // InternalOCLinEcore.g:5885:4: otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,54,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:5889:1: ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:5890:1: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:5890:1: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:5891:3: lv_ownedKeyType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_94);
                    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,59,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());

                    }
                    // InternalOCLinEcore.g:5911:1: ( (lv_ownedValueType_4_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:5912:1: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:5912:1: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:5913:3: lv_ownedValueType_4_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    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,55,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"
    // InternalOCLinEcore.g:5941:1: entryRuleTupleTypeCS returns [EObject current=null] : iv_ruleTupleTypeCS= ruleTupleTypeCS EOF ;
    public final EObject entryRuleTupleTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleTypeCS = null;


        try {
            // InternalOCLinEcore.g:5942:2: (iv_ruleTupleTypeCS= ruleTupleTypeCS EOF )
            // InternalOCLinEcore.g:5943: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"
    // InternalOCLinEcore.g:5950: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 {
            // InternalOCLinEcore.g:5953:28: ( ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? ) )
            // InternalOCLinEcore.g:5954:1: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            {
            // InternalOCLinEcore.g:5954:1: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            // InternalOCLinEcore.g:5954:2: ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            {
            // InternalOCLinEcore.g:5954:2: ( (lv_name_0_0= 'Tuple' ) )
            // InternalOCLinEcore.g:5955:1: (lv_name_0_0= 'Tuple' )
            {
            // InternalOCLinEcore.g:5955:1: (lv_name_0_0= 'Tuple' )
            // InternalOCLinEcore.g:5956:3: lv_name_0_0= 'Tuple'
            {
            lv_name_0_0=(Token)match(input,99,FollowSets000.FOLLOW_92); 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");

            }

            }


            }

            // InternalOCLinEcore.g:5969:2: (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==54) ) {
                alt151=1;
            }
            switch (alt151) {
                case 1 :
                    // InternalOCLinEcore.g:5969:4: otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,54,FollowSets000.FOLLOW_55); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:5973:1: ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )?
                    int alt150=2;
                    int LA150_0 = input.LA(1);

                    if ( ((LA150_0>=RULE_SIMPLE_ID && LA150_0<=RULE_ESCAPED_ID)||LA150_0==17||(LA150_0>=19 && LA150_0<=53)||LA150_0==58||LA150_0==71||(LA150_0>=73 && LA150_0<=74)||LA150_0==76||LA150_0==80) ) {
                        alt150=1;
                    }
                    switch (alt150) {
                        case 1 :
                            // InternalOCLinEcore.g:5973:2: ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            {
                            // InternalOCLinEcore.g:5973:2: ( (lv_ownedParts_2_0= ruleTuplePartCS ) )
                            // InternalOCLinEcore.g:5974:1: (lv_ownedParts_2_0= ruleTuplePartCS )
                            {
                            // InternalOCLinEcore.g:5974:1: (lv_ownedParts_2_0= ruleTuplePartCS )
                            // InternalOCLinEcore.g:5975:3: lv_ownedParts_2_0= ruleTuplePartCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_21);
                            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();

                            }

                            }


                            }

                            // InternalOCLinEcore.g:5991:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            loop149:
                            do {
                                int alt149=2;
                                int LA149_0 = input.LA(1);

                                if ( (LA149_0==59) ) {
                                    alt149=1;
                                }


                                switch (alt149) {
                            	case 1 :
                            	    // InternalOCLinEcore.g:5991:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    {
                            	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	          	newLeafNode(otherlv_3, grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());

                            	    }
                            	    // InternalOCLinEcore.g:5995:1: ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    // InternalOCLinEcore.g:5996:1: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    {
                            	    // InternalOCLinEcore.g:5996:1: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    // InternalOCLinEcore.g:5997:3: lv_ownedParts_4_0= ruleTuplePartCS
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());

                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_21);
                            	    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 loop149;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_5=(Token)match(input,55,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"
    // InternalOCLinEcore.g:6025:1: entryRuleTuplePartCS returns [EObject current=null] : iv_ruleTuplePartCS= ruleTuplePartCS EOF ;
    public final EObject entryRuleTuplePartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTuplePartCS = null;


        try {
            // InternalOCLinEcore.g:6026:2: (iv_ruleTuplePartCS= ruleTuplePartCS EOF )
            // InternalOCLinEcore.g:6027: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"
    // InternalOCLinEcore.g:6034: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 {
            // InternalOCLinEcore.g:6037:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalOCLinEcore.g:6038:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalOCLinEcore.g:6038:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalOCLinEcore.g:6038:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalOCLinEcore.g:6038:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:6039:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:6039:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:6040:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_17);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

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

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

            }
            // InternalOCLinEcore.g:6060:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalOCLinEcore.g:6061:1: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:6061:1: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalOCLinEcore.g:6062: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"
    // InternalOCLinEcore.g:6086:1: entryRuleCollectionLiteralExpCS returns [EObject current=null] : iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF ;
    public final EObject entryRuleCollectionLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6087:2: (iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF )
            // InternalOCLinEcore.g:6088: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"
    // InternalOCLinEcore.g:6095: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 {
            // InternalOCLinEcore.g:6098:28: ( ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalOCLinEcore.g:6099:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalOCLinEcore.g:6099:1: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalOCLinEcore.g:6099:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalOCLinEcore.g:6099:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:6100:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:6100:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalOCLinEcore.g:6101:3: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_95);
            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,60,FollowSets000.FOLLOW_96); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:6121:1: ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( ((LA153_0>=RULE_INT && LA153_0<=RULE_SINGLE_QUOTED_STRING)||(LA153_0>=RULE_SIMPLE_ID && LA153_0<=RULE_ESCAPED_ID)||(LA153_0>=17 && LA153_0<=54)||LA153_0==56||LA153_0==58||LA153_0==71||(LA153_0>=73 && LA153_0<=74)||LA153_0==76||LA153_0==80||(LA153_0>=83 && LA153_0<=84)||(LA153_0>=98 && LA153_0<=99)||(LA153_0>=101 && LA153_0<=113)||LA153_0==116||(LA153_0>=118 && LA153_0<=121)||LA153_0==128||(LA153_0>=133 && LA153_0<=134)) ) {
                alt153=1;
            }
            switch (alt153) {
                case 1 :
                    // InternalOCLinEcore.g:6121:2: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    {
                    // InternalOCLinEcore.g:6121:2: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) )
                    // InternalOCLinEcore.g:6122:1: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    {
                    // InternalOCLinEcore.g:6122:1: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    // InternalOCLinEcore.g:6123:3: lv_ownedParts_2_0= ruleCollectionLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_97);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:6139:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    loop152:
                    do {
                        int alt152=2;
                        int LA152_0 = input.LA(1);

                        if ( (LA152_0==59) ) {
                            alt152=1;
                        }


                        switch (alt152) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:6139:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_98); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:6143:1: ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    // InternalOCLinEcore.g:6144:1: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    {
                    	    // InternalOCLinEcore.g:6144:1: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    // InternalOCLinEcore.g:6145:3: lv_ownedParts_4_0= ruleCollectionLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_97);
                    	    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 loop152;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,61,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"
    // InternalOCLinEcore.g:6173:1: entryRuleCollectionLiteralPartCS returns [EObject current=null] : iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF ;
    public final EObject entryRuleCollectionLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralPartCS = null;


        try {
            // InternalOCLinEcore.g:6174:2: (iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF )
            // InternalOCLinEcore.g:6175: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"
    // InternalOCLinEcore.g:6182: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 {
            // InternalOCLinEcore.g:6185:28: ( ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) ) )
            // InternalOCLinEcore.g:6186:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            {
            // InternalOCLinEcore.g:6186:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            int alt155=2;
            alt155 = dfa155.predict(input);
            switch (alt155) {
                case 1 :
                    // InternalOCLinEcore.g:6186:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    {
                    // InternalOCLinEcore.g:6186:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    // InternalOCLinEcore.g:6186:3: ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    {
                    // InternalOCLinEcore.g:6186:3: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalOCLinEcore.g:6187:1: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalOCLinEcore.g:6187:1: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalOCLinEcore.g:6188:3: lv_ownedExpression_0_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_99);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:6204:2: (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    int alt154=2;
                    int LA154_0 = input.LA(1);

                    if ( (LA154_0==114) ) {
                        alt154=1;
                    }
                    switch (alt154) {
                        case 1 :
                            // InternalOCLinEcore.g:6204:4: otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            {
                            otherlv_1=(Token)match(input,114,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());

                            }
                            // InternalOCLinEcore.g:6208:1: ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:6209:1: (lv_ownedLastExpression_2_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:6209:1: (lv_ownedLastExpression_2_0= ruleExpCS )
                            // InternalOCLinEcore.g:6210: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 :
                    // InternalOCLinEcore.g:6227:6: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    {
                    // InternalOCLinEcore.g:6227:6: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    // InternalOCLinEcore.g:6228:1: (lv_ownedExpression_3_0= rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:6228:1: (lv_ownedExpression_3_0= rulePatternExpCS )
                    // InternalOCLinEcore.g:6229: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"
    // InternalOCLinEcore.g:6253:1: entryRuleCollectionPatternCS returns [EObject current=null] : iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF ;
    public final EObject entryRuleCollectionPatternCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionPatternCS = null;


        try {
            // InternalOCLinEcore.g:6254:2: (iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF )
            // InternalOCLinEcore.g:6255: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"
    // InternalOCLinEcore.g:6262: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 {
            // InternalOCLinEcore.g:6265: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= '}' ) )
            // InternalOCLinEcore.g:6266: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= '}' )
            {
            // InternalOCLinEcore.g:6266: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= '}' )
            // InternalOCLinEcore.g:6266: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= '}'
            {
            // InternalOCLinEcore.g:6266:2: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:6267:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:6267:1: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalOCLinEcore.g:6268:3: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_95);
            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,60,FollowSets000.FOLLOW_96); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:6288:1: ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )?
            int alt157=2;
            int LA157_0 = input.LA(1);

            if ( ((LA157_0>=RULE_SIMPLE_ID && LA157_0<=RULE_ESCAPED_ID)||LA157_0==17||(LA157_0>=19 && LA157_0<=53)||LA157_0==56||LA157_0==58||LA157_0==71||(LA157_0>=73 && LA157_0<=74)||LA157_0==76||LA157_0==80) ) {
                alt157=1;
            }
            switch (alt157) {
                case 1 :
                    // InternalOCLinEcore.g:6288:2: ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    {
                    // InternalOCLinEcore.g:6288:2: ( (lv_ownedParts_2_0= rulePatternExpCS ) )
                    // InternalOCLinEcore.g:6289:1: (lv_ownedParts_2_0= rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:6289:1: (lv_ownedParts_2_0= rulePatternExpCS )
                    // InternalOCLinEcore.g:6290:3: lv_ownedParts_2_0= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_101);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:6306:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )*
                    loop156:
                    do {
                        int alt156=2;
                        int LA156_0 = input.LA(1);

                        if ( (LA156_0==59) ) {
                            alt156=1;
                        }


                        switch (alt156) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:6306:4: otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_98); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:6310:1: ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    // InternalOCLinEcore.g:6311:1: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    {
                    	    // InternalOCLinEcore.g:6311:1: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    // InternalOCLinEcore.g:6312:3: lv_ownedParts_4_0= rulePatternExpCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_101);
                    	    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 loop156;
                        }
                    } while (true);

                    // InternalOCLinEcore.g:6328:4: (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    // InternalOCLinEcore.g:6328:6: otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    {
                    otherlv_5=(Token)match(input,115,FollowSets000.FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());

                    }
                    // InternalOCLinEcore.g:6332:1: ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    // InternalOCLinEcore.g:6333:1: (lv_restVariableName_6_0= ruleIdentifier )
                    {
                    // InternalOCLinEcore.g:6333:1: (lv_restVariableName_6_0= ruleIdentifier )
                    // InternalOCLinEcore.g:6334:3: lv_restVariableName_6_0= ruleIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_40);
                    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,61,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"
    // InternalOCLinEcore.g:6362:1: entryRuleShadowPartCS returns [EObject current=null] : iv_ruleShadowPartCS= ruleShadowPartCS EOF ;
    public final EObject entryRuleShadowPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleShadowPartCS = null;


        try {
            // InternalOCLinEcore.g:6363:2: (iv_ruleShadowPartCS= ruleShadowPartCS EOF )
            // InternalOCLinEcore.g:6364: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"
    // InternalOCLinEcore.g:6371: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 {
            // InternalOCLinEcore.g:6374:28: ( ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) ) )
            // InternalOCLinEcore.g:6375:1: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            {
            // InternalOCLinEcore.g:6375:1: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( ((LA159_0>=RULE_SIMPLE_ID && LA159_0<=RULE_ESCAPED_ID)||LA159_0==17||(LA159_0>=19 && LA159_0<=53)||LA159_0==58||LA159_0==71||(LA159_0>=73 && LA159_0<=74)||LA159_0==76||LA159_0==80) ) {
                alt159=1;
            }
            else if ( (LA159_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt159=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 159, 0, input);

                throw nvae;
            }
            switch (alt159) {
                case 1 :
                    // InternalOCLinEcore.g:6375:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    {
                    // InternalOCLinEcore.g:6375:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    // InternalOCLinEcore.g:6375:3: ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    {
                    // InternalOCLinEcore.g:6375:3: ( ( ruleUnrestrictedName ) )
                    // InternalOCLinEcore.g:6376:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:6376:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:6377: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_42);
                    ruleUnrestrictedName();

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

                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

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

                          	newLeafNode(otherlv_1, grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());

                    }
                    // InternalOCLinEcore.g:6397:1: ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    // InternalOCLinEcore.g:6398:1: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    {
                    // InternalOCLinEcore.g:6398:1: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    // InternalOCLinEcore.g:6399:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:6399:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    int alt158=2;
                    alt158 = dfa158.predict(input);
                    switch (alt158) {
                        case 1 :
                            // InternalOCLinEcore.g:6400: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 :
                            // InternalOCLinEcore.g:6415: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 :
                    // InternalOCLinEcore.g:6434:6: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    {
                    // InternalOCLinEcore.g:6434:6: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    // InternalOCLinEcore.g:6435:1: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:6435:1: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    // InternalOCLinEcore.g:6436: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"
    // InternalOCLinEcore.g:6460:1: entryRulePatternExpCS returns [EObject current=null] : iv_rulePatternExpCS= rulePatternExpCS EOF ;
    public final EObject entryRulePatternExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternExpCS = null;


        try {
            // InternalOCLinEcore.g:6461:2: (iv_rulePatternExpCS= rulePatternExpCS EOF )
            // InternalOCLinEcore.g:6462: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"
    // InternalOCLinEcore.g:6469: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 {
            // InternalOCLinEcore.g:6472:28: ( ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) ) )
            // InternalOCLinEcore.g:6473:1: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalOCLinEcore.g:6473:1: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            // InternalOCLinEcore.g:6473:2: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            {
            // InternalOCLinEcore.g:6473:2: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( ((LA160_0>=RULE_SIMPLE_ID && LA160_0<=RULE_ESCAPED_ID)||LA160_0==17||(LA160_0>=19 && LA160_0<=53)||LA160_0==58||LA160_0==71||(LA160_0>=73 && LA160_0<=74)||LA160_0==76||LA160_0==80) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // InternalOCLinEcore.g:6474:1: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:6474:1: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    // InternalOCLinEcore.g:6475:3: lv_patternVariableName_0_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

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

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

            }
            // InternalOCLinEcore.g:6495:1: ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            // InternalOCLinEcore.g:6496:1: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:6496:1: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            // InternalOCLinEcore.g:6497: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"
    // InternalOCLinEcore.g:6521:1: entryRuleLambdaLiteralExpCS returns [EObject current=null] : iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF ;
    public final EObject entryRuleLambdaLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLambdaLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6522:2: (iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF )
            // InternalOCLinEcore.g:6523: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"
    // InternalOCLinEcore.g:6530: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 {
            // InternalOCLinEcore.g:6533:28: ( (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' ) )
            // InternalOCLinEcore.g:6534:1: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            {
            // InternalOCLinEcore.g:6534:1: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            // InternalOCLinEcore.g:6534:3: otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}'
            {
            otherlv_0=(Token)match(input,116,FollowSets000.FOLLOW_95); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());

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

                  	newLeafNode(otherlv_1, grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:6542:1: ( (lv_ownedExpressionCS_2_0= ruleExpCS ) )
            // InternalOCLinEcore.g:6543:1: (lv_ownedExpressionCS_2_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:6543:1: (lv_ownedExpressionCS_2_0= ruleExpCS )
            // InternalOCLinEcore.g:6544:3: lv_ownedExpressionCS_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_40);
            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,61,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"
    // InternalOCLinEcore.g:6572:1: entryRuleMapLiteralExpCS returns [EObject current=null] : iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF ;
    public final EObject entryRuleMapLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6573:2: (iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF )
            // InternalOCLinEcore.g:6574: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"
    // InternalOCLinEcore.g:6581: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 {
            // InternalOCLinEcore.g:6584:28: ( ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalOCLinEcore.g:6585:1: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalOCLinEcore.g:6585:1: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalOCLinEcore.g:6585:2: ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalOCLinEcore.g:6585:2: ( (lv_ownedType_0_0= ruleMapTypeCS ) )
            // InternalOCLinEcore.g:6586:1: (lv_ownedType_0_0= ruleMapTypeCS )
            {
            // InternalOCLinEcore.g:6586:1: (lv_ownedType_0_0= ruleMapTypeCS )
            // InternalOCLinEcore.g:6587:3: lv_ownedType_0_0= ruleMapTypeCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_95);
            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,60,FollowSets000.FOLLOW_103); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:6607:1: ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( ((LA162_0>=RULE_INT && LA162_0<=RULE_SINGLE_QUOTED_STRING)||(LA162_0>=RULE_SIMPLE_ID && LA162_0<=RULE_ESCAPED_ID)||(LA162_0>=17 && LA162_0<=54)||LA162_0==58||LA162_0==71||(LA162_0>=73 && LA162_0<=74)||LA162_0==76||LA162_0==80||(LA162_0>=83 && LA162_0<=84)||(LA162_0>=98 && LA162_0<=99)||(LA162_0>=101 && LA162_0<=113)||LA162_0==116||(LA162_0>=118 && LA162_0<=121)||LA162_0==128||(LA162_0>=133 && LA162_0<=134)) ) {
                alt162=1;
            }
            switch (alt162) {
                case 1 :
                    // InternalOCLinEcore.g:6607:2: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    {
                    // InternalOCLinEcore.g:6607:2: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) )
                    // InternalOCLinEcore.g:6608:1: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    {
                    // InternalOCLinEcore.g:6608:1: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    // InternalOCLinEcore.g:6609:3: lv_ownedParts_2_0= ruleMapLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_97);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:6625:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    loop161:
                    do {
                        int alt161=2;
                        int LA161_0 = input.LA(1);

                        if ( (LA161_0==59) ) {
                            alt161=1;
                        }


                        switch (alt161) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:6625:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_100); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:6629:1: ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    // InternalOCLinEcore.g:6630:1: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    {
                    	    // InternalOCLinEcore.g:6630:1: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    // InternalOCLinEcore.g:6631:3: lv_ownedParts_4_0= ruleMapLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_97);
                    	    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 loop161;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,61,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"
    // InternalOCLinEcore.g:6659:1: entryRuleMapLiteralPartCS returns [EObject current=null] : iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF ;
    public final EObject entryRuleMapLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralPartCS = null;


        try {
            // InternalOCLinEcore.g:6660:2: (iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF )
            // InternalOCLinEcore.g:6661: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"
    // InternalOCLinEcore.g:6668: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 {
            // InternalOCLinEcore.g:6671:28: ( ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) ) )
            // InternalOCLinEcore.g:6672:1: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            {
            // InternalOCLinEcore.g:6672:1: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            // InternalOCLinEcore.g:6672:2: ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) )
            {
            // InternalOCLinEcore.g:6672:2: ( (lv_ownedKey_0_0= ruleExpCS ) )
            // InternalOCLinEcore.g:6673:1: (lv_ownedKey_0_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:6673:1: (lv_ownedKey_0_0= ruleExpCS )
            // InternalOCLinEcore.g:6674:3: lv_ownedKey_0_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_104);
            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,117,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());

            }
            // InternalOCLinEcore.g:6694:1: ( (lv_ownedValue_2_0= ruleExpCS ) )
            // InternalOCLinEcore.g:6695:1: (lv_ownedValue_2_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:6695:1: (lv_ownedValue_2_0= ruleExpCS )
            // InternalOCLinEcore.g:6696: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"
    // InternalOCLinEcore.g:6720:1: entryRulePrimitiveLiteralExpCS returns [EObject current=null] : iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF ;
    public final EObject entryRulePrimitiveLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6721:2: (iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF )
            // InternalOCLinEcore.g:6722: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"
    // InternalOCLinEcore.g:6729: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 {
            // InternalOCLinEcore.g:6732: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 ) )
            // InternalOCLinEcore.g:6733: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 )
            {
            // InternalOCLinEcore.g:6733: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 alt163=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt163=1;
                }
                break;
            case RULE_SINGLE_QUOTED_STRING:
                {
                alt163=2;
                }
                break;
            case 118:
            case 119:
                {
                alt163=3;
                }
                break;
            case 84:
                {
                alt163=4;
                }
                break;
            case 120:
                {
                alt163=5;
                }
                break;
            case 121:
                {
                alt163=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 163, 0, input);

                throw nvae;
            }

            switch (alt163) {
                case 1 :
                    // InternalOCLinEcore.g:6734: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 :
                    // InternalOCLinEcore.g:6747: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 :
                    // InternalOCLinEcore.g:6760: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 :
                    // InternalOCLinEcore.g:6773: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 :
                    // InternalOCLinEcore.g:6786: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 :
                    // InternalOCLinEcore.g:6799: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"
    // InternalOCLinEcore.g:6818:1: entryRuleTupleLiteralExpCS returns [EObject current=null] : iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF ;
    public final EObject entryRuleTupleLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6819:2: (iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF )
            // InternalOCLinEcore.g:6820: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"
    // InternalOCLinEcore.g:6827: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 {
            // InternalOCLinEcore.g:6830:28: ( (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' ) )
            // InternalOCLinEcore.g:6831:1: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            {
            // InternalOCLinEcore.g:6831:1: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            // InternalOCLinEcore.g:6831: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,99,FollowSets000.FOLLOW_95); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());

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

                  	newLeafNode(otherlv_1, grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:6839:1: ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) )
            // InternalOCLinEcore.g:6840:1: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            {
            // InternalOCLinEcore.g:6840:1: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            // InternalOCLinEcore.g:6841:3: lv_ownedParts_2_0= ruleTupleLiteralPartCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_97);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:6857:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )*
            loop164:
            do {
                int alt164=2;
                int LA164_0 = input.LA(1);

                if ( (LA164_0==59) ) {
                    alt164=1;
                }


                switch (alt164) {
            	case 1 :
            	    // InternalOCLinEcore.g:6857:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    {
            	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_3, grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());

            	    }
            	    // InternalOCLinEcore.g:6861:1: ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    // InternalOCLinEcore.g:6862:1: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    {
            	    // InternalOCLinEcore.g:6862:1: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    // InternalOCLinEcore.g:6863:3: lv_ownedParts_4_0= ruleTupleLiteralPartCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_97);
            	    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 loop164;
                }
            } while (true);

            otherlv_5=(Token)match(input,61,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"
    // InternalOCLinEcore.g:6891:1: entryRuleTupleLiteralPartCS returns [EObject current=null] : iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF ;
    public final EObject entryRuleTupleLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralPartCS = null;


        try {
            // InternalOCLinEcore.g:6892:2: (iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF )
            // InternalOCLinEcore.g:6893: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"
    // InternalOCLinEcore.g:6900: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 {
            // InternalOCLinEcore.g:6903:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) ) )
            // InternalOCLinEcore.g:6904:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            {
            // InternalOCLinEcore.g:6904:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            // InternalOCLinEcore.g:6904:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            {
            // InternalOCLinEcore.g:6904:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:6905:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:6905:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:6906:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_105);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:6922:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( (LA165_0==56) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // InternalOCLinEcore.g:6922:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:6926:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:6927:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:6927:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:6928:3: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_42);
                    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,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());

            }
            // InternalOCLinEcore.g:6948:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            // InternalOCLinEcore.g:6949:1: (lv_ownedInitExpression_4_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:6949:1: (lv_ownedInitExpression_4_0= ruleExpCS )
            // InternalOCLinEcore.g:6950: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"
    // InternalOCLinEcore.g:6974:1: entryRuleNumberLiteralExpCS returns [EObject current=null] : iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF ;
    public final EObject entryRuleNumberLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNumberLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:6975:2: (iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF )
            // InternalOCLinEcore.g:6976: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"
    // InternalOCLinEcore.g:6983: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 {
            // InternalOCLinEcore.g:6986:28: ( ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) ) )
            // InternalOCLinEcore.g:6987:1: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            {
            // InternalOCLinEcore.g:6987:1: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            // InternalOCLinEcore.g:6988:1: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            {
            // InternalOCLinEcore.g:6988:1: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            // InternalOCLinEcore.g:6989: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"
    // InternalOCLinEcore.g:7013:1: entryRuleStringLiteralExpCS returns [EObject current=null] : iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF ;
    public final EObject entryRuleStringLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStringLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7014:2: (iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF )
            // InternalOCLinEcore.g:7015: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"
    // InternalOCLinEcore.g:7022: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 {
            // InternalOCLinEcore.g:7025:28: ( ( (lv_segments_0_0= ruleStringLiteral ) )+ )
            // InternalOCLinEcore.g:7026:1: ( (lv_segments_0_0= ruleStringLiteral ) )+
            {
            // InternalOCLinEcore.g:7026:1: ( (lv_segments_0_0= ruleStringLiteral ) )+
            int cnt166=0;
            loop166:
            do {
                int alt166=2;
                int LA166_0 = input.LA(1);

                if ( (LA166_0==RULE_SINGLE_QUOTED_STRING) ) {
                    alt166=1;
                }


                switch (alt166) {
            	case 1 :
            	    // InternalOCLinEcore.g:7027:1: (lv_segments_0_0= ruleStringLiteral )
            	    {
            	    // InternalOCLinEcore.g:7027:1: (lv_segments_0_0= ruleStringLiteral )
            	    // InternalOCLinEcore.g:7028:3: lv_segments_0_0= ruleStringLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_106);
            	    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 ( cnt166 >= 1 ) break loop166;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(166, input);
                        throw eee;
                }
                cnt166++;
            } while (true);


            }

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

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


    // $ANTLR start "entryRuleBooleanLiteralExpCS"
    // InternalOCLinEcore.g:7052:1: entryRuleBooleanLiteralExpCS returns [EObject current=null] : iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF ;
    public final EObject entryRuleBooleanLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBooleanLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7053:2: (iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF )
            // InternalOCLinEcore.g:7054: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"
    // InternalOCLinEcore.g:7061: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 {
            // InternalOCLinEcore.g:7064:28: ( ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) ) )
            // InternalOCLinEcore.g:7065:1: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            {
            // InternalOCLinEcore.g:7065:1: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==118) ) {
                alt167=1;
            }
            else if ( (LA167_0==119) ) {
                alt167=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 167, 0, input);

                throw nvae;
            }
            switch (alt167) {
                case 1 :
                    // InternalOCLinEcore.g:7065:2: ( (lv_symbol_0_0= 'true' ) )
                    {
                    // InternalOCLinEcore.g:7065:2: ( (lv_symbol_0_0= 'true' ) )
                    // InternalOCLinEcore.g:7066:1: (lv_symbol_0_0= 'true' )
                    {
                    // InternalOCLinEcore.g:7066:1: (lv_symbol_0_0= 'true' )
                    // InternalOCLinEcore.g:7067:3: lv_symbol_0_0= 'true'
                    {
                    lv_symbol_0_0=(Token)match(input,118,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 :
                    // InternalOCLinEcore.g:7081:6: ( (lv_symbol_1_0= 'false' ) )
                    {
                    // InternalOCLinEcore.g:7081:6: ( (lv_symbol_1_0= 'false' ) )
                    // InternalOCLinEcore.g:7082:1: (lv_symbol_1_0= 'false' )
                    {
                    // InternalOCLinEcore.g:7082:1: (lv_symbol_1_0= 'false' )
                    // InternalOCLinEcore.g:7083:3: lv_symbol_1_0= 'false'
                    {
                    lv_symbol_1_0=(Token)match(input,119,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"
    // InternalOCLinEcore.g:7104:1: entryRuleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF ;
    public final EObject entryRuleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnlimitedNaturalLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7105:2: (iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF )
            // InternalOCLinEcore.g:7106: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"
    // InternalOCLinEcore.g:7113:1: ruleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : ( () otherlv_1= '*' ) ;
    public final EObject ruleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:7116:28: ( ( () otherlv_1= '*' ) )
            // InternalOCLinEcore.g:7117:1: ( () otherlv_1= '*' )
            {
            // InternalOCLinEcore.g:7117:1: ( () otherlv_1= '*' )
            // InternalOCLinEcore.g:7117:2: () otherlv_1= '*'
            {
            // InternalOCLinEcore.g:7117:2: ()
            // InternalOCLinEcore.g:7118:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,84,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"
    // InternalOCLinEcore.g:7138:1: entryRuleInvalidLiteralExpCS returns [EObject current=null] : iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF ;
    public final EObject entryRuleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInvalidLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7139:2: (iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF )
            // InternalOCLinEcore.g:7140: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"
    // InternalOCLinEcore.g:7147:1: ruleInvalidLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'invalid' ) ;
    public final EObject ruleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:7150:28: ( ( () otherlv_1= 'invalid' ) )
            // InternalOCLinEcore.g:7151:1: ( () otherlv_1= 'invalid' )
            {
            // InternalOCLinEcore.g:7151:1: ( () otherlv_1= 'invalid' )
            // InternalOCLinEcore.g:7151:2: () otherlv_1= 'invalid'
            {
            // InternalOCLinEcore.g:7151:2: ()
            // InternalOCLinEcore.g:7152:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,120,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"
    // InternalOCLinEcore.g:7172:1: entryRuleNullLiteralExpCS returns [EObject current=null] : iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF ;
    public final EObject entryRuleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNullLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7173:2: (iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF )
            // InternalOCLinEcore.g:7174: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"
    // InternalOCLinEcore.g:7181:1: ruleNullLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:7184:28: ( ( () otherlv_1= 'null' ) )
            // InternalOCLinEcore.g:7185:1: ( () otherlv_1= 'null' )
            {
            // InternalOCLinEcore.g:7185:1: ( () otherlv_1= 'null' )
            // InternalOCLinEcore.g:7185:2: () otherlv_1= 'null'
            {
            // InternalOCLinEcore.g:7185:2: ()
            // InternalOCLinEcore.g:7186:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,121,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"
    // InternalOCLinEcore.g:7206:1: entryRuleTypeLiteralCS returns [EObject current=null] : iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF ;
    public final EObject entryRuleTypeLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralCS = null;


        try {
            // InternalOCLinEcore.g:7207:2: (iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF )
            // InternalOCLinEcore.g:7208: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"
    // InternalOCLinEcore.g:7215: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 {
            // InternalOCLinEcore.g:7218:28: ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS ) )
            // InternalOCLinEcore.g:7219:1: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            {
            // InternalOCLinEcore.g:7219:1: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            int alt168=4;
            switch ( input.LA(1) ) {
            case 101:
            case 102:
            case 103:
            case 104:
            case 105:
            case 106:
            case 107:
            case 108:
                {
                alt168=1;
                }
                break;
            case 109:
            case 110:
            case 111:
            case 112:
            case 113:
                {
                alt168=2;
                }
                break;
            case 98:
                {
                alt168=3;
                }
                break;
            case 99:
                {
                alt168=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 168, 0, input);

                throw nvae;
            }

            switch (alt168) {
                case 1 :
                    // InternalOCLinEcore.g:7220: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 :
                    // InternalOCLinEcore.g:7233: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 :
                    // InternalOCLinEcore.g:7246: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 :
                    // InternalOCLinEcore.g:7259: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"
    // InternalOCLinEcore.g:7278:1: entryRuleTypeLiteralWithMultiplicityCS returns [EObject current=null] : iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF ;
    public final EObject entryRuleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralWithMultiplicityCS = null;


        try {
            // InternalOCLinEcore.g:7279:2: (iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF )
            // InternalOCLinEcore.g:7280: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"
    // InternalOCLinEcore.g:7287: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 {
            // InternalOCLinEcore.g:7290:28: ( (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalOCLinEcore.g:7291:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalOCLinEcore.g:7291:1: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalOCLinEcore.g:7292: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_85);
            this_TypeLiteralCS_0=ruleTypeLiteralCS();

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

                      current = this_TypeLiteralCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalOCLinEcore.g:7303:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt169=2;
            int LA169_0 = input.LA(1);

            if ( (LA169_0==124) ) {
                alt169=1;
            }
            switch (alt169) {
                case 1 :
                    // InternalOCLinEcore.g:7304:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalOCLinEcore.g:7304:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalOCLinEcore.g:7305: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"
    // InternalOCLinEcore.g:7329:1: entryRuleTypeLiteralExpCS returns [EObject current=null] : iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF ;
    public final EObject entryRuleTypeLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralExpCS = null;


        try {
            // InternalOCLinEcore.g:7330:2: (iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF )
            // InternalOCLinEcore.g:7331: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"
    // InternalOCLinEcore.g:7338: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 {
            // InternalOCLinEcore.g:7341:28: ( ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) ) )
            // InternalOCLinEcore.g:7342:1: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            {
            // InternalOCLinEcore.g:7342:1: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            // InternalOCLinEcore.g:7343:1: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            {
            // InternalOCLinEcore.g:7343:1: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            // InternalOCLinEcore.g:7344: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"
    // InternalOCLinEcore.g:7368:1: entryRuleTypeNameExpCS returns [EObject current=null] : iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF ;
    public final EObject entryRuleTypeNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeNameExpCS = null;


        try {
            // InternalOCLinEcore.g:7369:2: (iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF )
            // InternalOCLinEcore.g:7370: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"
    // InternalOCLinEcore.g:7377: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 {
            // InternalOCLinEcore.g:7380:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? ) )
            // InternalOCLinEcore.g:7381:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            {
            // InternalOCLinEcore.g:7381:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            // InternalOCLinEcore.g:7381:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            {
            // InternalOCLinEcore.g:7381:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalOCLinEcore.g:7382:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalOCLinEcore.g:7382:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalOCLinEcore.g:7383:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_65);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:7399:2: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( (LA171_0==60) ) {
                alt171=1;
            }
            switch (alt171) {
                case 1 :
                    // InternalOCLinEcore.g:7399:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    {
                    // InternalOCLinEcore.g:7399:3: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) )
                    // InternalOCLinEcore.g:7400:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalOCLinEcore.g:7400:1: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    // InternalOCLinEcore.g:7401:3: lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_65);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:7417:2: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    int alt170=2;
                    int LA170_0 = input.LA(1);

                    if ( (LA170_0==60) ) {
                        alt170=1;
                    }
                    switch (alt170) {
                        case 1 :
                            // InternalOCLinEcore.g:7417:4: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
                            {
                            otherlv_2=(Token)match(input,60,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_2, grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());

                            }
                            // InternalOCLinEcore.g:7421:1: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:7422:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:7422:1: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            // InternalOCLinEcore.g:7423:3: lv_ownedPatternGuard_3_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_40);
                            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,61,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"
    // InternalOCLinEcore.g:7451:1: entryRuleTypeExpWithoutMultiplicityCS returns [EObject current=null] : iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF ;
    public final EObject entryRuleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpWithoutMultiplicityCS = null;


        try {
            // InternalOCLinEcore.g:7452:2: (iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF )
            // InternalOCLinEcore.g:7453: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"
    // InternalOCLinEcore.g:7460: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 {
            // InternalOCLinEcore.g:7463:28: ( (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS ) )
            // InternalOCLinEcore.g:7464:1: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            {
            // InternalOCLinEcore.g:7464:1: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            int alt172=3;
            alt172 = dfa172.predict(input);
            switch (alt172) {
                case 1 :
                    // InternalOCLinEcore.g:7465: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 :
                    // InternalOCLinEcore.g:7478: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 :
                    // InternalOCLinEcore.g:7491: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"
    // InternalOCLinEcore.g:7510:1: entryRuleTypeExpCS returns [EObject current=null] : iv_ruleTypeExpCS= ruleTypeExpCS EOF ;
    public final EObject entryRuleTypeExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpCS = null;


        try {
            // InternalOCLinEcore.g:7511:2: (iv_ruleTypeExpCS= ruleTypeExpCS EOF )
            // InternalOCLinEcore.g:7512: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"
    // InternalOCLinEcore.g:7519: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 {
            // InternalOCLinEcore.g:7522:28: ( (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalOCLinEcore.g:7523:1: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalOCLinEcore.g:7523:1: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalOCLinEcore.g:7524: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_85);
            this_TypeExpWithoutMultiplicityCS_0=ruleTypeExpWithoutMultiplicityCS();

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

                      current = this_TypeExpWithoutMultiplicityCS_0;
                      afterParserOrEnumRuleCall();

            }
            // InternalOCLinEcore.g:7535:1: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt173=2;
            int LA173_0 = input.LA(1);

            if ( (LA173_0==124) ) {
                alt173=1;
            }
            switch (alt173) {
                case 1 :
                    // InternalOCLinEcore.g:7536:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalOCLinEcore.g:7536:1: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalOCLinEcore.g:7537: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"
    // InternalOCLinEcore.g:7561:1: entryRuleExpCS returns [EObject current=null] : iv_ruleExpCS= ruleExpCS EOF ;
    public final EObject entryRuleExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExpCS = null;


        try {
            // InternalOCLinEcore.g:7562:2: (iv_ruleExpCS= ruleExpCS EOF )
            // InternalOCLinEcore.g:7563: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"
    // InternalOCLinEcore.g:7570: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 {
            // InternalOCLinEcore.g:7573:28: ( ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS ) )
            // InternalOCLinEcore.g:7574:1: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            {
            // InternalOCLinEcore.g:7574:1: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            int alt175=2;
            alt175 = dfa175.predict(input);
            switch (alt175) {
                case 1 :
                    // InternalOCLinEcore.g:7574:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    {
                    // InternalOCLinEcore.g:7574:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    // InternalOCLinEcore.g:7575: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_107);
                    this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

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

                              current = this_PrefixedPrimaryExpCS_0;
                              afterParserOrEnumRuleCall();

                    }
                    // InternalOCLinEcore.g:7586:1: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
                    int alt174=2;
                    int LA174_0 = input.LA(1);

                    if ( (LA174_0==18||LA174_0==62||(LA174_0>=81 && LA174_0<=82)||(LA174_0>=84 && LA174_0<=97)) ) {
                        alt174=1;
                    }
                    switch (alt174) {
                        case 1 :
                            // InternalOCLinEcore.g:7586:2: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                            {
                            // InternalOCLinEcore.g:7586:2: ()
                            // InternalOCLinEcore.g:7587:2:
                            {
                            if ( state.backtracking==0 ) {

                              	  /* */

                            }
                            if ( state.backtracking==0 ) {

                                      current = forceCreateModelElementAndSet(
                                          grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0(),
                                          current);

                            }

                            }

                            // InternalOCLinEcore.g:7595:2: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                            // InternalOCLinEcore.g:7596:1: (lv_name_2_0= ruleBinaryOperatorName )
                            {
                            // InternalOCLinEcore.g:7596:1: (lv_name_2_0= ruleBinaryOperatorName )
                            // InternalOCLinEcore.g:7597:3: lv_name_2_0= ruleBinaryOperatorName
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_100);
                            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();

                            }

                            }


                            }

                            // InternalOCLinEcore.g:7613:2: ( (lv_ownedRight_3_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:7614:1: (lv_ownedRight_3_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:7614:1: (lv_ownedRight_3_0= ruleExpCS )
                            // InternalOCLinEcore.g:7615: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 :
                    // InternalOCLinEcore.g:7633: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"
    // InternalOCLinEcore.g:7652:1: entryRulePrefixedLetExpCS returns [EObject current=null] : iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF ;
    public final EObject entryRulePrefixedLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedLetExpCS = null;


        try {
            // InternalOCLinEcore.g:7653:2: (iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF )
            // InternalOCLinEcore.g:7654: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"
    // InternalOCLinEcore.g:7661: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 {
            // InternalOCLinEcore.g:7664:28: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS ) )
            // InternalOCLinEcore.g:7665:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            {
            // InternalOCLinEcore.g:7665:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            int alt176=2;
            int LA176_0 = input.LA(1);

            if ( (LA176_0==18||LA176_0==83) ) {
                alt176=1;
            }
            else if ( (LA176_0==133) ) {
                alt176=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 176, 0, input);

                throw nvae;
            }
            switch (alt176) {
                case 1 :
                    // InternalOCLinEcore.g:7665:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    {
                    // InternalOCLinEcore.g:7665:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    // InternalOCLinEcore.g:7665:3: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    {
                    // InternalOCLinEcore.g:7665:3: ()
                    // InternalOCLinEcore.g:7666:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0(),
                                  current);

                    }

                    }

                    // InternalOCLinEcore.g:7674:2: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalOCLinEcore.g:7675:1: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalOCLinEcore.g:7675:1: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalOCLinEcore.g:7676:3: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_100);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:7692:2: ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    // InternalOCLinEcore.g:7693:1: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    {
                    // InternalOCLinEcore.g:7693:1: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    // InternalOCLinEcore.g:7694: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 :
                    // InternalOCLinEcore.g:7712: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"
    // InternalOCLinEcore.g:7731:1: entryRulePrefixedPrimaryExpCS returns [EObject current=null] : iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF ;
    public final EObject entryRulePrefixedPrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedPrimaryExpCS = null;


        try {
            // InternalOCLinEcore.g:7732:2: (iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF )
            // InternalOCLinEcore.g:7733: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"
    // InternalOCLinEcore.g:7740: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 {
            // InternalOCLinEcore.g:7743:28: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS ) )
            // InternalOCLinEcore.g:7744:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            {
            // InternalOCLinEcore.g:7744:1: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            int alt177=2;
            int LA177_0 = input.LA(1);

            if ( (LA177_0==18||LA177_0==83) ) {
                alt177=1;
            }
            else if ( ((LA177_0>=RULE_INT && LA177_0<=RULE_SINGLE_QUOTED_STRING)||(LA177_0>=RULE_SIMPLE_ID && LA177_0<=RULE_ESCAPED_ID)||LA177_0==17||(LA177_0>=19 && LA177_0<=54)||LA177_0==58||LA177_0==71||(LA177_0>=73 && LA177_0<=74)||LA177_0==76||LA177_0==80||LA177_0==84||(LA177_0>=98 && LA177_0<=99)||(LA177_0>=101 && LA177_0<=113)||LA177_0==116||(LA177_0>=118 && LA177_0<=121)||LA177_0==128||LA177_0==134) ) {
                alt177=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 177, 0, input);

                throw nvae;
            }
            switch (alt177) {
                case 1 :
                    // InternalOCLinEcore.g:7744:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    {
                    // InternalOCLinEcore.g:7744:2: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    // InternalOCLinEcore.g:7744:3: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    {
                    // InternalOCLinEcore.g:7744:3: ()
                    // InternalOCLinEcore.g:7745:2:
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              current = forceCreateModelElement(
                                  grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0(),
                                  current);

                    }

                    }

                    // InternalOCLinEcore.g:7753:2: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalOCLinEcore.g:7754:1: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalOCLinEcore.g:7754:1: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalOCLinEcore.g:7755:3: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_29);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:7771:2: ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    // InternalOCLinEcore.g:7772:1: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    {
                    // InternalOCLinEcore.g:7772:1: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    // InternalOCLinEcore.g:7773: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 :
                    // InternalOCLinEcore.g:7791: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"
    // InternalOCLinEcore.g:7810:1: entryRulePrimaryExpCS returns [EObject current=null] : iv_rulePrimaryExpCS= rulePrimaryExpCS EOF ;
    public final EObject entryRulePrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimaryExpCS = null;


        try {
            // InternalOCLinEcore.g:7811:2: (iv_rulePrimaryExpCS= rulePrimaryExpCS EOF )
            // InternalOCLinEcore.g:7812: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"
    // InternalOCLinEcore.g:7819: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 {
            // InternalOCLinEcore.g:7822: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 ) )
            // InternalOCLinEcore.g:7823: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 )
            {
            // InternalOCLinEcore.g:7823: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 alt178=10;
            alt178 = dfa178.predict(input);
            switch (alt178) {
                case 1 :
                    // InternalOCLinEcore.g:7824: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 :
                    // InternalOCLinEcore.g:7837: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 :
                    // InternalOCLinEcore.g:7850: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 :
                    // InternalOCLinEcore.g:7863: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 :
                    // InternalOCLinEcore.g:7876: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 :
                    // InternalOCLinEcore.g:7889: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 :
                    // InternalOCLinEcore.g:7902: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 :
                    // InternalOCLinEcore.g:7915: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 :
                    // InternalOCLinEcore.g:7928: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 :
                    // InternalOCLinEcore.g:7941: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"
    // InternalOCLinEcore.g:7960:1: entryRuleNameExpCS returns [EObject current=null] : iv_ruleNameExpCS= ruleNameExpCS EOF ;
    public final EObject entryRuleNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNameExpCS = null;


        try {
            // InternalOCLinEcore.g:7961:2: (iv_ruleNameExpCS= ruleNameExpCS EOF )
            // InternalOCLinEcore.g:7962: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"
    // InternalOCLinEcore.g:7969: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 {
            // InternalOCLinEcore.g:7972: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' )? ) )
            // InternalOCLinEcore.g:7973: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' )? )
            {
            // InternalOCLinEcore.g:7973: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' )? )
            // InternalOCLinEcore.g:7973: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' )?
            {
            // InternalOCLinEcore.g:7973:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalOCLinEcore.g:7974:1: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalOCLinEcore.g:7974:1: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalOCLinEcore.g:7975:3: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_108);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:7991:2: ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )*
            loop179:
            do {
                int alt179=2;
                int LA179_0 = input.LA(1);

                if ( (LA179_0==124) ) {
                    alt179=1;
                }


                switch (alt179) {
            	case 1 :
            	    // InternalOCLinEcore.g:7992:1: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    {
            	    // InternalOCLinEcore.g:7992:1: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    // InternalOCLinEcore.g:7993:3: lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_108);
            	    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 loop179;
                }
            } while (true);

            // InternalOCLinEcore.g:8009:3: ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )?
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( (LA180_0==54) ) {
                alt180=1;
            }
            switch (alt180) {
                case 1 :
                    // InternalOCLinEcore.g:8010:1: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalOCLinEcore.g:8010:1: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    // InternalOCLinEcore.g:8011:3: lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_109);
                    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;

            }

            // InternalOCLinEcore.g:8027:3: ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )?
            int alt181=2;
            int LA181_0 = input.LA(1);

            if ( (LA181_0==60) ) {
                alt181=1;
            }
            switch (alt181) {
                case 1 :
                    // InternalOCLinEcore.g:8028:1: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalOCLinEcore.g:8028:1: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    // InternalOCLinEcore.g:8029:3: lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_110);
                    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;

            }

            // InternalOCLinEcore.g:8045:3: ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )?
            int alt182=2;
            int LA182_0 = input.LA(1);

            if ( (LA182_0==122) ) {
                alt182=1;
            }
            switch (alt182) {
                case 1 :
                    // InternalOCLinEcore.g:8045:4: ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre'
                    {
                    // InternalOCLinEcore.g:8045:4: ( (lv_isPre_4_0= '@' ) )
                    // InternalOCLinEcore.g:8046:1: (lv_isPre_4_0= '@' )
                    {
                    // InternalOCLinEcore.g:8046:1: (lv_isPre_4_0= '@' )
                    // InternalOCLinEcore.g:8047:3: lv_isPre_4_0= '@'
                    {
                    lv_isPre_4_0=(Token)match(input,122,FollowSets000.FOLLOW_111); 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,123,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"
    // InternalOCLinEcore.g:8072:1: entryRuleCurlyBracketedClauseCS returns [EObject current=null] : iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF ;
    public final EObject entryRuleCurlyBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCurlyBracketedClauseCS = null;


        try {
            // InternalOCLinEcore.g:8073:2: (iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF )
            // InternalOCLinEcore.g:8074: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"
    // InternalOCLinEcore.g:8081: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 {
            // InternalOCLinEcore.g:8084:28: ( ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalOCLinEcore.g:8085:1: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalOCLinEcore.g:8085:1: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            // InternalOCLinEcore.g:8085:2: () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalOCLinEcore.g:8085:2: ()
            // InternalOCLinEcore.g:8086:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalOCLinEcore.g:8098:1: ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )?
            int alt184=2;
            int LA184_0 = input.LA(1);

            if ( (LA184_0==RULE_SINGLE_QUOTED_STRING||(LA184_0>=RULE_SIMPLE_ID && LA184_0<=RULE_ESCAPED_ID)||LA184_0==17||(LA184_0>=19 && LA184_0<=53)||LA184_0==58||LA184_0==71||(LA184_0>=73 && LA184_0<=74)||LA184_0==76||LA184_0==80) ) {
                alt184=1;
            }
            switch (alt184) {
                case 1 :
                    // InternalOCLinEcore.g:8098:2: ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    {
                    // InternalOCLinEcore.g:8098:2: ( (lv_ownedParts_2_0= ruleShadowPartCS ) )
                    // InternalOCLinEcore.g:8099:1: (lv_ownedParts_2_0= ruleShadowPartCS )
                    {
                    // InternalOCLinEcore.g:8099:1: (lv_ownedParts_2_0= ruleShadowPartCS )
                    // InternalOCLinEcore.g:8100:3: lv_ownedParts_2_0= ruleShadowPartCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_97);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8116:2: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    loop183:
                    do {
                        int alt183=2;
                        int LA183_0 = input.LA(1);

                        if ( (LA183_0==59) ) {
                            alt183=1;
                        }


                        switch (alt183) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:8116:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,59,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalOCLinEcore.g:8120:1: ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    // InternalOCLinEcore.g:8121:1: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    {
                    	    // InternalOCLinEcore.g:8121:1: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    // InternalOCLinEcore.g:8122:3: lv_ownedParts_4_0= ruleShadowPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_97);
                    	    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 loop183;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,61,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"
    // InternalOCLinEcore.g:8150:1: entryRuleRoundBracketedClauseCS returns [EObject current=null] : iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF ;
    public final EObject entryRuleRoundBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRoundBracketedClauseCS = null;


        try {
            // InternalOCLinEcore.g:8151:2: (iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF )
            // InternalOCLinEcore.g:8152: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"
    // InternalOCLinEcore.g:8159: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 {
            // InternalOCLinEcore.g:8162: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= ')' ) )
            // InternalOCLinEcore.g:8163: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= ')' )
            {
            // InternalOCLinEcore.g:8163: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= ')' )
            // InternalOCLinEcore.g:8163: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= ')'
            {
            // InternalOCLinEcore.g:8163:2: ()
            // InternalOCLinEcore.g:8164:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());

            }
            // InternalOCLinEcore.g:8176:1: ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )?
            int alt187=2;
            int LA187_0 = input.LA(1);

            if ( ((LA187_0>=RULE_INT && LA187_0<=RULE_SINGLE_QUOTED_STRING)||(LA187_0>=RULE_SIMPLE_ID && LA187_0<=RULE_ESCAPED_ID)||(LA187_0>=17 && LA187_0<=54)||LA187_0==56||LA187_0==58||LA187_0==71||(LA187_0>=73 && LA187_0<=74)||LA187_0==76||LA187_0==80||(LA187_0>=83 && LA187_0<=84)||(LA187_0>=98 && LA187_0<=99)||(LA187_0>=101 && LA187_0<=113)||LA187_0==116||(LA187_0>=118 && LA187_0<=121)||LA187_0==128||(LA187_0>=133 && LA187_0<=134)) ) {
                alt187=1;
            }
            switch (alt187) {
                case 1 :
                    // InternalOCLinEcore.g:8176:2: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    {
                    // InternalOCLinEcore.g:8176:2: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) )
                    // InternalOCLinEcore.g:8177:1: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    {
                    // InternalOCLinEcore.g:8177:1: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    // InternalOCLinEcore.g:8178:3: lv_ownedArguments_2_0= ruleNavigatingArgCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_113);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8194:2: ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    loop186:
                    do {
                        int alt186=2;
                        int LA186_0 = input.LA(1);

                        if ( (LA186_0==57||LA186_0==59||LA186_0==127) ) {
                            alt186=1;
                        }


                        switch (alt186) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:8195:1: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    {
                    	    // InternalOCLinEcore.g:8195:1: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    // InternalOCLinEcore.g:8196:1: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    {
                    	    // InternalOCLinEcore.g:8196:1: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    int alt185=3;
                    	    switch ( input.LA(1) ) {
                    	    case 59:
                    	        {
                    	        alt185=1;
                    	        }
                    	        break;
                    	    case 57:
                    	        {
                    	        alt185=2;
                    	        }
                    	        break;
                    	    case 127:
                    	        {
                    	        alt185=3;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 185, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt185) {
                    	        case 1 :
                    	            // InternalOCLinEcore.g:8197:3: lv_ownedArguments_3_1= ruleNavigatingCommaArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_113);
                    	            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 :
                    	            // InternalOCLinEcore.g:8212:8: lv_ownedArguments_3_2= ruleNavigatingSemiArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_113);
                    	            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 :
                    	            // InternalOCLinEcore.g:8227:8: lv_ownedArguments_3_3= ruleNavigatingBarArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_113);
                    	            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 loop186;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_4=(Token)match(input,55,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"
    // InternalOCLinEcore.g:8257:1: entryRuleSquareBracketedClauseCS returns [EObject current=null] : iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF ;
    public final EObject entryRuleSquareBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSquareBracketedClauseCS = null;


        try {
            // InternalOCLinEcore.g:8258:2: (iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF )
            // InternalOCLinEcore.g:8259: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"
    // InternalOCLinEcore.g:8266: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 {
            // InternalOCLinEcore.g:8269:28: ( (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' ) )
            // InternalOCLinEcore.g:8270:1: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            {
            // InternalOCLinEcore.g:8270:1: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            // InternalOCLinEcore.g:8270:3: otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']'
            {
            otherlv_0=(Token)match(input,124,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalOCLinEcore.g:8274:1: ( (lv_ownedTerms_1_0= ruleExpCS ) )
            // InternalOCLinEcore.g:8275:1: (lv_ownedTerms_1_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:8275:1: (lv_ownedTerms_1_0= ruleExpCS )
            // InternalOCLinEcore.g:8276:3: lv_ownedTerms_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_114);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:8292:2: (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )*
            loop188:
            do {
                int alt188=2;
                int LA188_0 = input.LA(1);

                if ( (LA188_0==59) ) {
                    alt188=1;
                }


                switch (alt188) {
            	case 1 :
            	    // InternalOCLinEcore.g:8292:4: otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    {
            	    otherlv_2=(Token)match(input,59,FollowSets000.FOLLOW_100); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalOCLinEcore.g:8296:1: ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    // InternalOCLinEcore.g:8297:1: (lv_ownedTerms_3_0= ruleExpCS )
            	    {
            	    // InternalOCLinEcore.g:8297:1: (lv_ownedTerms_3_0= ruleExpCS )
            	    // InternalOCLinEcore.g:8298:3: lv_ownedTerms_3_0= ruleExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_114);
            	    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 loop188;
                }
            } while (true);

            otherlv_4=(Token)match(input,125,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"
    // InternalOCLinEcore.g:8326:1: entryRuleNavigatingArgCS returns [EObject current=null] : iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF ;
    public final EObject entryRuleNavigatingArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgCS = null;


        try {
            // InternalOCLinEcore.g:8327:2: (iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF )
            // InternalOCLinEcore.g:8328: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"
    // InternalOCLinEcore.g:8335: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 {
            // InternalOCLinEcore.g:8338: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 ) ) ) ) )
            // InternalOCLinEcore.g:8339: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 ) ) ) )
            {
            // InternalOCLinEcore.g:8339: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 alt195=2;
            int LA195_0 = input.LA(1);

            if ( ((LA195_0>=RULE_INT && LA195_0<=RULE_SINGLE_QUOTED_STRING)||(LA195_0>=RULE_SIMPLE_ID && LA195_0<=RULE_ESCAPED_ID)||(LA195_0>=17 && LA195_0<=54)||LA195_0==58||LA195_0==71||(LA195_0>=73 && LA195_0<=74)||LA195_0==76||LA195_0==80||(LA195_0>=83 && LA195_0<=84)||(LA195_0>=98 && LA195_0<=99)||(LA195_0>=101 && LA195_0<=113)||LA195_0==116||(LA195_0>=118 && LA195_0<=121)||LA195_0==128||(LA195_0>=133 && LA195_0<=134)) ) {
                alt195=1;
            }
            else if ( (LA195_0==56) ) {
                alt195=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;
            }
            switch (alt195) {
                case 1 :
                    // InternalOCLinEcore.g:8339: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 ) ) ) )? )
                    {
                    // InternalOCLinEcore.g:8339: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 ) ) ) )? )
                    // InternalOCLinEcore.g:8339: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 ) ) ) )?
                    {
                    // InternalOCLinEcore.g:8339:3: ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) )
                    // InternalOCLinEcore.g:8340:1: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    {
                    // InternalOCLinEcore.g:8340:1: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    // InternalOCLinEcore.g:8341:3: lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_115);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8357: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 alt194=4;
                    alt194 = dfa194.predict(input);
                    switch (alt194) {
                        case 1 :
                            // InternalOCLinEcore.g:8357:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            {
                            // InternalOCLinEcore.g:8357:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            // InternalOCLinEcore.g:8357:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            {
                            otherlv_1=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_1, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());

                            }
                            // InternalOCLinEcore.g:8361:1: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
                            // InternalOCLinEcore.g:8362:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            {
                            // InternalOCLinEcore.g:8362:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            // InternalOCLinEcore.g:8363:3: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_116);
                            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();

                            }

                            }


                            }

                            // InternalOCLinEcore.g:8379:2: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            int alt189=2;
                            int LA189_0 = input.LA(1);

                            if ( (LA189_0==62) ) {
                                alt189=1;
                            }
                            switch (alt189) {
                                case 1 :
                                    // InternalOCLinEcore.g:8379:4: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    {
                                    otherlv_3=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_3, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());

                                    }
                                    // InternalOCLinEcore.g:8383:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    // InternalOCLinEcore.g:8384:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    {
                                    // InternalOCLinEcore.g:8384:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    // InternalOCLinEcore.g:8385: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 :
                            // InternalOCLinEcore.g:8402:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            {
                            // InternalOCLinEcore.g:8402:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            // InternalOCLinEcore.g:8402: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,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_5, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());

                            }
                            // InternalOCLinEcore.g:8406:1: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
                            // InternalOCLinEcore.g:8407:1: (lv_ownedType_6_0= ruleTypeExpCS )
                            {
                            // InternalOCLinEcore.g:8407:1: (lv_ownedType_6_0= ruleTypeExpCS )
                            // InternalOCLinEcore.g:8408:3: lv_ownedType_6_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_117);
                            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();

                            }

                            }


                            }

                            // InternalOCLinEcore.g:8424:2: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
                            int alt190=2;
                            int LA190_0 = input.LA(1);

                            if ( (LA190_0==117) ) {
                                alt190=1;
                            }
                            switch (alt190) {
                                case 1 :
                                    // InternalOCLinEcore.g:8424:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_7=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_7, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());

                                    }
                                    // InternalOCLinEcore.g:8428:1: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    // InternalOCLinEcore.g:8429:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalOCLinEcore.g:8429:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    // InternalOCLinEcore.g:8430:3: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_116);
                                    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;

                            }

                            // InternalOCLinEcore.g:8446:4: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                            int alt191=2;
                            int LA191_0 = input.LA(1);

                            if ( (LA191_0==62) ) {
                                alt191=1;
                            }
                            switch (alt191) {
                                case 1 :
                                    // InternalOCLinEcore.g:8446:6: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    {
                                    otherlv_9=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_9, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());

                                    }
                                    // InternalOCLinEcore.g:8450:1: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    // InternalOCLinEcore.g:8451:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    {
                                    // InternalOCLinEcore.g:8451:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    // InternalOCLinEcore.g:8452: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 :
                            // InternalOCLinEcore.g:8469:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            {
                            // InternalOCLinEcore.g:8469:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            // InternalOCLinEcore.g:8469:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            {
                            // InternalOCLinEcore.g:8469:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
                            int alt192=2;
                            int LA192_0 = input.LA(1);

                            if ( (LA192_0==56) ) {
                                alt192=1;
                            }
                            switch (alt192) {
                                case 1 :
                                    // InternalOCLinEcore.g:8469:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    {
                                    otherlv_11=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_11, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());

                                    }
                                    // InternalOCLinEcore.g:8473:1: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    // InternalOCLinEcore.g:8474:1: (lv_ownedType_12_0= ruleTypeExpCS )
                                    {
                                    // InternalOCLinEcore.g:8474:1: (lv_ownedType_12_0= ruleTypeExpCS )
                                    // InternalOCLinEcore.g:8475:3: lv_ownedType_12_0= ruleTypeExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_118);
                                    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;

                            }

                            // InternalOCLinEcore.g:8491:4: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
                            int alt193=2;
                            int LA193_0 = input.LA(1);

                            if ( (LA193_0==117) ) {
                                alt193=1;
                            }
                            switch (alt193) {
                                case 1 :
                                    // InternalOCLinEcore.g:8491:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_13=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_13, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());

                                    }
                                    // InternalOCLinEcore.g:8495:1: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    // InternalOCLinEcore.g:8496:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalOCLinEcore.g:8496:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    // InternalOCLinEcore.g:8497:3: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_119);
                                    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,126,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_15, grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());

                            }
                            // InternalOCLinEcore.g:8517:1: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:8518:1: (lv_ownedInitExpression_16_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:8518:1: (lv_ownedInitExpression_16_0= ruleExpCS )
                            // InternalOCLinEcore.g:8519: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 :
                    // InternalOCLinEcore.g:8536:6: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    {
                    // InternalOCLinEcore.g:8536:6: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    // InternalOCLinEcore.g:8536:8: otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    {
                    otherlv_17=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_17, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:8540:1: ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:8541:1: (lv_ownedType_18_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:8541:1: (lv_ownedType_18_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:8542: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"
    // InternalOCLinEcore.g:8566:1: entryRuleNavigatingBarArgCS returns [EObject current=null] : iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF ;
    public final EObject entryRuleNavigatingBarArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingBarArgCS = null;


        try {
            // InternalOCLinEcore.g:8567:2: (iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF )
            // InternalOCLinEcore.g:8568: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"
    // InternalOCLinEcore.g:8575: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 {
            // InternalOCLinEcore.g:8578:28: ( ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalOCLinEcore.g:8579:1: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalOCLinEcore.g:8579:1: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalOCLinEcore.g:8579:2: ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalOCLinEcore.g:8579:2: ( (lv_prefix_0_0= '|' ) )
            // InternalOCLinEcore.g:8580:1: (lv_prefix_0_0= '|' )
            {
            // InternalOCLinEcore.g:8580:1: (lv_prefix_0_0= '|' )
            // InternalOCLinEcore.g:8581:3: lv_prefix_0_0= '|'
            {
            lv_prefix_0_0=(Token)match(input,127,FollowSets000.FOLLOW_100); 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, "|");

            }

            }


            }

            // InternalOCLinEcore.g:8594:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:8595:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:8595:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:8596:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_120);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:8612:2: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt197=2;
            int LA197_0 = input.LA(1);

            if ( (LA197_0==56) ) {
                alt197=1;
            }
            switch (alt197) {
                case 1 :
                    // InternalOCLinEcore.g:8612:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:8616:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:8617:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:8617:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:8618:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_116);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8634:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt196=2;
                    int LA196_0 = input.LA(1);

                    if ( (LA196_0==62) ) {
                        alt196=1;
                    }
                    switch (alt196) {
                        case 1 :
                            // InternalOCLinEcore.g:8634:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalOCLinEcore.g:8638:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:8639:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:8639:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalOCLinEcore.g:8640: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"
    // InternalOCLinEcore.g:8664:1: entryRuleNavigatingCommaArgCS returns [EObject current=null] : iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF ;
    public final EObject entryRuleNavigatingCommaArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingCommaArgCS = null;


        try {
            // InternalOCLinEcore.g:8665:2: (iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF )
            // InternalOCLinEcore.g:8666: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"
    // InternalOCLinEcore.g:8673: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 {
            // InternalOCLinEcore.g:8676: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 ) ) ) )? ) )
            // InternalOCLinEcore.g:8677: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 ) ) ) )? )
            {
            // InternalOCLinEcore.g:8677: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 ) ) ) )? )
            // InternalOCLinEcore.g:8677: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 ) ) ) )?
            {
            // InternalOCLinEcore.g:8677:2: ( (lv_prefix_0_0= ',' ) )
            // InternalOCLinEcore.g:8678:1: (lv_prefix_0_0= ',' )
            {
            // InternalOCLinEcore.g:8678:1: (lv_prefix_0_0= ',' )
            // InternalOCLinEcore.g:8679:3: lv_prefix_0_0= ','
            {
            lv_prefix_0_0=(Token)match(input,59,FollowSets000.FOLLOW_100); 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, ",");

            }

            }


            }

            // InternalOCLinEcore.g:8692:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:8693:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:8693:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:8694:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_115);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:8710: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 alt203=4;
            alt203 = dfa203.predict(input);
            switch (alt203) {
                case 1 :
                    // InternalOCLinEcore.g:8710:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    {
                    // InternalOCLinEcore.g:8710:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    // InternalOCLinEcore.g:8710:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());

                    }
                    // InternalOCLinEcore.g:8714:1: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
                    // InternalOCLinEcore.g:8715:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    {
                    // InternalOCLinEcore.g:8715:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    // InternalOCLinEcore.g:8716:3: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_116);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8732:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt198=2;
                    int LA198_0 = input.LA(1);

                    if ( (LA198_0==62) ) {
                        alt198=1;
                    }
                    switch (alt198) {
                        case 1 :
                            // InternalOCLinEcore.g:8732:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());

                            }
                            // InternalOCLinEcore.g:8736:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:8737:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:8737:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalOCLinEcore.g:8738: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 :
                    // InternalOCLinEcore.g:8755:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    {
                    // InternalOCLinEcore.g:8755:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    // InternalOCLinEcore.g:8755: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,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());

                    }
                    // InternalOCLinEcore.g:8759:1: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:8760:1: (lv_ownedType_7_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:8760:1: (lv_ownedType_7_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:8761:3: lv_ownedType_7_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_117);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8777:2: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
                    int alt199=2;
                    int LA199_0 = input.LA(1);

                    if ( (LA199_0==117) ) {
                        alt199=1;
                    }
                    switch (alt199) {
                        case 1 :
                            // InternalOCLinEcore.g:8777:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_8=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_8, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());

                            }
                            // InternalOCLinEcore.g:8781:1: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            // InternalOCLinEcore.g:8782:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            {
                            // InternalOCLinEcore.g:8782:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            // InternalOCLinEcore.g:8783:3: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_116);
                            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;

                    }

                    // InternalOCLinEcore.g:8799:4: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                    int alt200=2;
                    int LA200_0 = input.LA(1);

                    if ( (LA200_0==62) ) {
                        alt200=1;
                    }
                    switch (alt200) {
                        case 1 :
                            // InternalOCLinEcore.g:8799:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            {
                            otherlv_10=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_10, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());

                            }
                            // InternalOCLinEcore.g:8803:1: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:8804:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:8804:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                            // InternalOCLinEcore.g:8805: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 :
                    // InternalOCLinEcore.g:8822:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    {
                    // InternalOCLinEcore.g:8822:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    // InternalOCLinEcore.g:8822:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    {
                    // InternalOCLinEcore.g:8822:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
                    int alt201=2;
                    int LA201_0 = input.LA(1);

                    if ( (LA201_0==56) ) {
                        alt201=1;
                    }
                    switch (alt201) {
                        case 1 :
                            // InternalOCLinEcore.g:8822:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            {
                            otherlv_12=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_12, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());

                            }
                            // InternalOCLinEcore.g:8826:1: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            // InternalOCLinEcore.g:8827:1: (lv_ownedType_13_0= ruleTypeExpCS )
                            {
                            // InternalOCLinEcore.g:8827:1: (lv_ownedType_13_0= ruleTypeExpCS )
                            // InternalOCLinEcore.g:8828:3: lv_ownedType_13_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_118);
                            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;

                    }

                    // InternalOCLinEcore.g:8844:4: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
                    int alt202=2;
                    int LA202_0 = input.LA(1);

                    if ( (LA202_0==117) ) {
                        alt202=1;
                    }
                    switch (alt202) {
                        case 1 :
                            // InternalOCLinEcore.g:8844:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_14=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_14, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());

                            }
                            // InternalOCLinEcore.g:8848:1: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            // InternalOCLinEcore.g:8849:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            {
                            // InternalOCLinEcore.g:8849:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            // InternalOCLinEcore.g:8850:3: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_119);
                            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,126,FollowSets000.FOLLOW_100); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_16, grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());

                    }
                    // InternalOCLinEcore.g:8870:1: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    // InternalOCLinEcore.g:8871:1: (lv_ownedInitExpression_17_0= ruleExpCS )
                    {
                    // InternalOCLinEcore.g:8871:1: (lv_ownedInitExpression_17_0= ruleExpCS )
                    // InternalOCLinEcore.g:8872: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"
    // InternalOCLinEcore.g:8896:1: entryRuleNavigatingSemiArgCS returns [EObject current=null] : iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF ;
    public final EObject entryRuleNavigatingSemiArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingSemiArgCS = null;


        try {
            // InternalOCLinEcore.g:8897:2: (iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF )
            // InternalOCLinEcore.g:8898: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"
    // InternalOCLinEcore.g:8905: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 {
            // InternalOCLinEcore.g:8908:28: ( ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalOCLinEcore.g:8909:1: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalOCLinEcore.g:8909:1: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalOCLinEcore.g:8909:2: ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalOCLinEcore.g:8909:2: ( (lv_prefix_0_0= ';' ) )
            // InternalOCLinEcore.g:8910:1: (lv_prefix_0_0= ';' )
            {
            // InternalOCLinEcore.g:8910:1: (lv_prefix_0_0= ';' )
            // InternalOCLinEcore.g:8911:3: lv_prefix_0_0= ';'
            {
            lv_prefix_0_0=(Token)match(input,57,FollowSets000.FOLLOW_100); 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, ";");

            }

            }


            }

            // InternalOCLinEcore.g:8924:2: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:8925:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:8925:1: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:8926:3: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_120);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:8942:2: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==56) ) {
                alt205=1;
            }
            switch (alt205) {
                case 1 :
                    // InternalOCLinEcore.g:8942:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:8946:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:8947:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:8947:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:8948:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_116);
                    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();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:8964:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt204=2;
                    int LA204_0 = input.LA(1);

                    if ( (LA204_0==62) ) {
                        alt204=1;
                    }
                    switch (alt204) {
                        case 1 :
                            // InternalOCLinEcore.g:8964:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_4, grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalOCLinEcore.g:8968:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalOCLinEcore.g:8969:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalOCLinEcore.g:8969:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalOCLinEcore.g:8970: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"
    // InternalOCLinEcore.g:8994:1: entryRuleNavigatingArgExpCS returns [EObject current=null] : iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF ;
    public final EObject entryRuleNavigatingArgExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgExpCS = null;


        try {
            // InternalOCLinEcore.g:8995:2: (iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF )
            // InternalOCLinEcore.g:8996: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"
    // InternalOCLinEcore.g:9003: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 {
            // InternalOCLinEcore.g:9006:28: (this_ExpCS_0= ruleExpCS )
            // InternalOCLinEcore.g:9008: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"
    // InternalOCLinEcore.g:9027:1: entryRuleCoIteratorVariableCS returns [EObject current=null] : iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF ;
    public final EObject entryRuleCoIteratorVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCoIteratorVariableCS = null;


        try {
            // InternalOCLinEcore.g:9028:2: (iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF )
            // InternalOCLinEcore.g:9029: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"
    // InternalOCLinEcore.g:9036: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 {
            // InternalOCLinEcore.g:9039:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) )
            // InternalOCLinEcore.g:9040:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            {
            // InternalOCLinEcore.g:9040:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            // InternalOCLinEcore.g:9040:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            {
            // InternalOCLinEcore.g:9040:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:9041:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:9041:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:9042:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_120);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:9058:2: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt206=2;
            int LA206_0 = input.LA(1);

            if ( (LA206_0==56) ) {
                alt206=1;
            }
            switch (alt206) {
                case 1 :
                    // InternalOCLinEcore.g:9058:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:9062:1: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:9063:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:9063:1: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:9064: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"
    // InternalOCLinEcore.g:9088:1: entryRuleIfExpCS returns [EObject current=null] : iv_ruleIfExpCS= ruleIfExpCS EOF ;
    public final EObject entryRuleIfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIfExpCS = null;


        try {
            // InternalOCLinEcore.g:9089:2: (iv_ruleIfExpCS= ruleIfExpCS EOF )
            // InternalOCLinEcore.g:9090: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"
    // InternalOCLinEcore.g:9097: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 {
            // InternalOCLinEcore.g:9100: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' ) )
            // InternalOCLinEcore.g:9101: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' )
            {
            // InternalOCLinEcore.g:9101: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' )
            // InternalOCLinEcore.g:9101: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,128,FollowSets000.FOLLOW_98); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getIfExpCSAccess().getIfKeyword_0());

            }
            // InternalOCLinEcore.g:9105:1: ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) )
            // InternalOCLinEcore.g:9106:1: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            {
            // InternalOCLinEcore.g:9106:1: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            // InternalOCLinEcore.g:9107:1: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            {
            // InternalOCLinEcore.g:9107:1: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            int alt207=2;
            alt207 = dfa207.predict(input);
            switch (alt207) {
                case 1 :
                    // InternalOCLinEcore.g:9108:3: lv_ownedCondition_1_1= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_121);
                    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 :
                    // InternalOCLinEcore.g:9123:8: lv_ownedCondition_1_2= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_121);
                    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,129,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getIfExpCSAccess().getThenKeyword_2());

            }
            // InternalOCLinEcore.g:9145:1: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9146:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9146:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalOCLinEcore.g:9147:3: lv_ownedThenExpression_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_122);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:9163:2: ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )*
            loop208:
            do {
                int alt208=2;
                int LA208_0 = input.LA(1);

                if ( (LA208_0==132) ) {
                    alt208=1;
                }


                switch (alt208) {
            	case 1 :
            	    // InternalOCLinEcore.g:9164:1: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    {
            	    // InternalOCLinEcore.g:9164:1: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    // InternalOCLinEcore.g:9165:3: lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_122);
            	    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 loop208;
                }
            } while (true);

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

                  	newLeafNode(otherlv_5, grammarAccess.getIfExpCSAccess().getElseKeyword_5());

            }
            // InternalOCLinEcore.g:9185:1: ( (lv_ownedElseExpression_6_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9186:1: (lv_ownedElseExpression_6_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9186:1: (lv_ownedElseExpression_6_0= ruleExpCS )
            // InternalOCLinEcore.g:9187:3: lv_ownedElseExpression_6_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());

            }
            pushFollow(FollowSets000.FOLLOW_123);
            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,131,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"
    // InternalOCLinEcore.g:9215:1: entryRuleElseIfThenExpCS returns [EObject current=null] : iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF ;
    public final EObject entryRuleElseIfThenExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleElseIfThenExpCS = null;


        try {
            // InternalOCLinEcore.g:9216:2: (iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF )
            // InternalOCLinEcore.g:9217: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"
    // InternalOCLinEcore.g:9224: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 {
            // InternalOCLinEcore.g:9227:28: ( (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ) )
            // InternalOCLinEcore.g:9228:1: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            {
            // InternalOCLinEcore.g:9228:1: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            // InternalOCLinEcore.g:9228:3: otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            {
            otherlv_0=(Token)match(input,132,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());

            }
            // InternalOCLinEcore.g:9232:1: ( (lv_ownedCondition_1_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9233:1: (lv_ownedCondition_1_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9233:1: (lv_ownedCondition_1_0= ruleExpCS )
            // InternalOCLinEcore.g:9234:3: lv_ownedCondition_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_121);
            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,129,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());

            }
            // InternalOCLinEcore.g:9254:1: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9255:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9255:1: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalOCLinEcore.g:9256: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"
    // InternalOCLinEcore.g:9280:1: entryRuleLetExpCS returns [EObject current=null] : iv_ruleLetExpCS= ruleLetExpCS EOF ;
    public final EObject entryRuleLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetExpCS = null;


        try {
            // InternalOCLinEcore.g:9281:2: (iv_ruleLetExpCS= ruleLetExpCS EOF )
            // InternalOCLinEcore.g:9282: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"
    // InternalOCLinEcore.g:9289: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 {
            // InternalOCLinEcore.g:9292:28: ( (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) ) )
            // InternalOCLinEcore.g:9293:1: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            {
            // InternalOCLinEcore.g:9293:1: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            // InternalOCLinEcore.g:9293: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,133,FollowSets000.FOLLOW_3); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getLetExpCSAccess().getLetKeyword_0());

            }
            // InternalOCLinEcore.g:9297:1: ( (lv_ownedVariables_1_0= ruleLetVariableCS ) )
            // InternalOCLinEcore.g:9298:1: (lv_ownedVariables_1_0= ruleLetVariableCS )
            {
            // InternalOCLinEcore.g:9298:1: (lv_ownedVariables_1_0= ruleLetVariableCS )
            // InternalOCLinEcore.g:9299:3: lv_ownedVariables_1_0= ruleLetVariableCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_124);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:9315:2: (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )*
            loop209:
            do {
                int alt209=2;
                int LA209_0 = input.LA(1);

                if ( (LA209_0==59) ) {
                    alt209=1;
                }


                switch (alt209) {
            	case 1 :
            	    // InternalOCLinEcore.g:9315:4: otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    {
            	    otherlv_2=(Token)match(input,59,FollowSets000.FOLLOW_3); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_2, grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalOCLinEcore.g:9319:1: ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    // InternalOCLinEcore.g:9320:1: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    {
            	    // InternalOCLinEcore.g:9320:1: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    // InternalOCLinEcore.g:9321:3: lv_ownedVariables_3_0= ruleLetVariableCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_124);
            	    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 loop209;
                }
            } while (true);

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

                  	newLeafNode(otherlv_4, grammarAccess.getLetExpCSAccess().getInKeyword_3());

            }
            // InternalOCLinEcore.g:9341:1: ( (lv_ownedInExpression_5_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9342:1: (lv_ownedInExpression_5_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9342:1: (lv_ownedInExpression_5_0= ruleExpCS )
            // InternalOCLinEcore.g:9343: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"
    // InternalOCLinEcore.g:9367:1: entryRuleLetVariableCS returns [EObject current=null] : iv_ruleLetVariableCS= ruleLetVariableCS EOF ;
    public final EObject entryRuleLetVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetVariableCS = null;


        try {
            // InternalOCLinEcore.g:9368:2: (iv_ruleLetVariableCS= ruleLetVariableCS EOF )
            // InternalOCLinEcore.g:9369: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"
    // InternalOCLinEcore.g:9376: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 {
            // InternalOCLinEcore.g:9379: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 ) ) ) )
            // InternalOCLinEcore.g:9380: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 ) ) )
            {
            // InternalOCLinEcore.g:9380: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 ) ) )
            // InternalOCLinEcore.g:9380: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 ) )
            {
            // InternalOCLinEcore.g:9380:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:9381:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:9381:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:9382:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_125);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:9398:2: ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )?
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( (LA210_0==54) ) {
                alt210=1;
            }
            switch (alt210) {
                case 1 :
                    // InternalOCLinEcore.g:9399:1: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalOCLinEcore.g:9399:1: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    // InternalOCLinEcore.g:9400:3: lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_105);
                    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;

            }

            // InternalOCLinEcore.g:9416:3: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )?
            int alt211=2;
            int LA211_0 = input.LA(1);

            if ( (LA211_0==56) ) {
                alt211=1;
            }
            switch (alt211) {
                case 1 :
                    // InternalOCLinEcore.g:9416:5: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    {
                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

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

                    }
                    // InternalOCLinEcore.g:9420:1: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalOCLinEcore.g:9421:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalOCLinEcore.g:9421:1: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalOCLinEcore.g:9422:3: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_42);
                    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,62,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());

            }
            // InternalOCLinEcore.g:9442:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9443:1: (lv_ownedInitExpression_5_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9443:1: (lv_ownedInitExpression_5_0= ruleExpCS )
            // InternalOCLinEcore.g:9444: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"
    // InternalOCLinEcore.g:9468:1: entryRuleNestedExpCS returns [EObject current=null] : iv_ruleNestedExpCS= ruleNestedExpCS EOF ;
    public final EObject entryRuleNestedExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNestedExpCS = null;


        try {
            // InternalOCLinEcore.g:9469:2: (iv_ruleNestedExpCS= ruleNestedExpCS EOF )
            // InternalOCLinEcore.g:9470: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"
    // InternalOCLinEcore.g:9477: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 {
            // InternalOCLinEcore.g:9480:28: ( (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' ) )
            // InternalOCLinEcore.g:9481:1: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            {
            // InternalOCLinEcore.g:9481:1: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            // InternalOCLinEcore.g:9481:3: otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,54,FollowSets000.FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());

            }
            // InternalOCLinEcore.g:9485:1: ( (lv_ownedExpression_1_0= ruleExpCS ) )
            // InternalOCLinEcore.g:9486:1: (lv_ownedExpression_1_0= ruleExpCS )
            {
            // InternalOCLinEcore.g:9486:1: (lv_ownedExpression_1_0= ruleExpCS )
            // InternalOCLinEcore.g:9487:3: lv_ownedExpression_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            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,55,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"
    // InternalOCLinEcore.g:9515:1: entryRuleSelfExpCS returns [EObject current=null] : iv_ruleSelfExpCS= ruleSelfExpCS EOF ;
    public final EObject entryRuleSelfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSelfExpCS = null;


        try {
            // InternalOCLinEcore.g:9516:2: (iv_ruleSelfExpCS= ruleSelfExpCS EOF )
            // InternalOCLinEcore.g:9517: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"
    // InternalOCLinEcore.g:9524:1: ruleSelfExpCS returns [EObject current=null] : ( () otherlv_1= 'self' ) ;
    public final EObject ruleSelfExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;

         enterRule();

        try {
            // InternalOCLinEcore.g:9527:28: ( ( () otherlv_1= 'self' ) )
            // InternalOCLinEcore.g:9528:1: ( () otherlv_1= 'self' )
            {
            // InternalOCLinEcore.g:9528:1: ( () otherlv_1= 'self' )
            // InternalOCLinEcore.g:9528:2: () otherlv_1= 'self'
            {
            // InternalOCLinEcore.g:9528:2: ()
            // InternalOCLinEcore.g:9529:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0(),
                          current);

            }

            }

            otherlv_1=(Token)match(input,134,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"
    // InternalOCLinEcore.g:9549:1: entryRuleMultiplicityBoundsCS returns [EObject current=null] : iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF ;
    public final EObject entryRuleMultiplicityBoundsCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityBoundsCS = null;


        try {
            // InternalOCLinEcore.g:9550:2: (iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF )
            // InternalOCLinEcore.g:9551: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"
    // InternalOCLinEcore.g:9558: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 {
            // InternalOCLinEcore.g:9561:28: ( ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? ) )
            // InternalOCLinEcore.g:9562:1: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            {
            // InternalOCLinEcore.g:9562:1: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            // InternalOCLinEcore.g:9562:2: ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            {
            // InternalOCLinEcore.g:9562:2: ( (lv_lowerBound_0_0= ruleLOWER ) )
            // InternalOCLinEcore.g:9563:1: (lv_lowerBound_0_0= ruleLOWER )
            {
            // InternalOCLinEcore.g:9563:1: (lv_lowerBound_0_0= ruleLOWER )
            // InternalOCLinEcore.g:9564:3: lv_lowerBound_0_0= ruleLOWER
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_99);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:9580:2: (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            int alt212=2;
            int LA212_0 = input.LA(1);

            if ( (LA212_0==114) ) {
                alt212=1;
            }
            switch (alt212) {
                case 1 :
                    // InternalOCLinEcore.g:9580:4: otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) )
                    {
                    otherlv_1=(Token)match(input,114,FollowSets000.FOLLOW_126); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:9584:1: ( (lv_upperBound_2_0= ruleUPPER ) )
                    // InternalOCLinEcore.g:9585:1: (lv_upperBound_2_0= ruleUPPER )
                    {
                    // InternalOCLinEcore.g:9585:1: (lv_upperBound_2_0= ruleUPPER )
                    // InternalOCLinEcore.g:9586: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"
    // InternalOCLinEcore.g:9610:1: entryRuleMultiplicityCS returns [EObject current=null] : iv_ruleMultiplicityCS= ruleMultiplicityCS EOF ;
    public final EObject entryRuleMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityCS = null;


        try {
            // InternalOCLinEcore.g:9611:2: (iv_ruleMultiplicityCS= ruleMultiplicityCS EOF )
            // InternalOCLinEcore.g:9612: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"
    // InternalOCLinEcore.g:9619: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 {
            // InternalOCLinEcore.g:9622:28: ( (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' ) )
            // InternalOCLinEcore.g:9623:1: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            {
            // InternalOCLinEcore.g:9623:1: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            // InternalOCLinEcore.g:9623: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,124,FollowSets000.FOLLOW_127); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalOCLinEcore.g:9627:1: (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS )
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==RULE_INT) ) {
                alt213=1;
            }
            else if ( (LA213_0==84||LA213_0==86||LA213_0==137) ) {
                alt213=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 213, 0, input);

                throw nvae;
            }
            switch (alt213) {
                case 1 :
                    // InternalOCLinEcore.g:9628:2: this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_128);
                    this_MultiplicityBoundsCS_1=ruleMultiplicityBoundsCS();

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

                              current = this_MultiplicityBoundsCS_1;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:9641:2: this_MultiplicityStringCS_2= ruleMultiplicityStringCS
                    {
                    if ( state.backtracking==0 ) {

                      	  /* */

                    }
                    if ( state.backtracking==0 ) {

                              newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_128);
                    this_MultiplicityStringCS_2=ruleMultiplicityStringCS();

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

                              current = this_MultiplicityStringCS_2;
                              afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }

            // InternalOCLinEcore.g:9652:2: (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )?
            int alt214=3;
            int LA214_0 = input.LA(1);

            if ( (LA214_0==135) ) {
                alt214=1;
            }
            else if ( (LA214_0==136) ) {
                alt214=2;
            }
            switch (alt214) {
                case 1 :
                    // InternalOCLinEcore.g:9652:4: otherlv_3= '|?'
                    {
                    otherlv_3=(Token)match(input,135,FollowSets000.FOLLOW_129); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:9657:6: ( (lv_isNullFree_4_0= '|1' ) )
                    {
                    // InternalOCLinEcore.g:9657:6: ( (lv_isNullFree_4_0= '|1' ) )
                    // InternalOCLinEcore.g:9658:1: (lv_isNullFree_4_0= '|1' )
                    {
                    // InternalOCLinEcore.g:9658:1: (lv_isNullFree_4_0= '|1' )
                    // InternalOCLinEcore.g:9659:3: lv_isNullFree_4_0= '|1'
                    {
                    lv_isNullFree_4_0=(Token)match(input,136,FollowSets000.FOLLOW_129); 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,125,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"
    // InternalOCLinEcore.g:9684:1: entryRuleMultiplicityStringCS returns [EObject current=null] : iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF ;
    public final EObject entryRuleMultiplicityStringCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityStringCS = null;


        try {
            // InternalOCLinEcore.g:9685:2: (iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF )
            // InternalOCLinEcore.g:9686: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"
    // InternalOCLinEcore.g:9693: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 {
            // InternalOCLinEcore.g:9696:28: ( ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) ) )
            // InternalOCLinEcore.g:9697:1: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            {
            // InternalOCLinEcore.g:9697:1: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            // InternalOCLinEcore.g:9698:1: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            {
            // InternalOCLinEcore.g:9698:1: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            // InternalOCLinEcore.g:9699:1: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            {
            // InternalOCLinEcore.g:9699:1: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            int alt215=3;
            switch ( input.LA(1) ) {
            case 84:
                {
                alt215=1;
                }
                break;
            case 86:
                {
                alt215=2;
                }
                break;
            case 137:
                {
                alt215=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 215, 0, input);

                throw nvae;
            }

            switch (alt215) {
                case 1 :
                    // InternalOCLinEcore.g:9700:3: lv_stringBounds_0_1= '*'
                    {
                    lv_stringBounds_0_1=(Token)match(input,84,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 :
                    // InternalOCLinEcore.g:9712:8: lv_stringBounds_0_2= '+'
                    {
                    lv_stringBounds_0_2=(Token)match(input,86,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 :
                    // InternalOCLinEcore.g:9724:8: lv_stringBounds_0_3= '?'
                    {
                    lv_stringBounds_0_3=(Token)match(input,137,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"
    // InternalOCLinEcore.g:9747:1: entryRulePathNameCS returns [EObject current=null] : iv_rulePathNameCS= rulePathNameCS EOF ;
    public final EObject entryRulePathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePathNameCS = null;


        try {
            // InternalOCLinEcore.g:9748:2: (iv_rulePathNameCS= rulePathNameCS EOF )
            // InternalOCLinEcore.g:9749: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"
    // InternalOCLinEcore.g:9756: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 {
            // InternalOCLinEcore.g:9759:28: ( ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalOCLinEcore.g:9760:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalOCLinEcore.g:9760:1: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalOCLinEcore.g:9760:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalOCLinEcore.g:9760:2: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) )
            // InternalOCLinEcore.g:9761:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            {
            // InternalOCLinEcore.g:9761:1: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            // InternalOCLinEcore.g:9762:3: lv_ownedPathElements_0_0= ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_90);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:9778:2: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop216:
            do {
                int alt216=2;
                int LA216_0 = input.LA(1);

                if ( (LA216_0==100) ) {
                    alt216=1;
                }


                switch (alt216) {
            	case 1 :
            	    // InternalOCLinEcore.g:9778:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,100,FollowSets000.FOLLOW_91); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalOCLinEcore.g:9782:1: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalOCLinEcore.g:9783:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalOCLinEcore.g:9783:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalOCLinEcore.g:9784:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_90);
            	    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 loop216;
                }
            } while (true);


            }


            }

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

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


    // $ANTLR start "entryRuleFirstPathElementCS"
    // InternalOCLinEcore.g:9808:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
    public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFirstPathElementCS = null;


        try {
            // InternalOCLinEcore.g:9809:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
            // InternalOCLinEcore.g:9810: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"
    // InternalOCLinEcore.g:9817:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
    public final EObject ruleFirstPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalOCLinEcore.g:9820:28: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:9821:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:9821:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:9822:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:9822:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:9823: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"
    // InternalOCLinEcore.g:9847:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
    public final EObject entryRuleNextPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNextPathElementCS = null;


        try {
            // InternalOCLinEcore.g:9848:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
            // InternalOCLinEcore.g:9849: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"
    // InternalOCLinEcore.g:9856:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
    public final EObject ruleNextPathElementCS() throws RecognitionException {
        EObject current = null;

         enterRule();

        try {
            // InternalOCLinEcore.g:9859:28: ( ( ( ruleUnreservedName ) ) )
            // InternalOCLinEcore.g:9860:1: ( ( ruleUnreservedName ) )
            {
            // InternalOCLinEcore.g:9860:1: ( ( ruleUnreservedName ) )
            // InternalOCLinEcore.g:9861:1: ( ruleUnreservedName )
            {
            // InternalOCLinEcore.g:9861:1: ( ruleUnreservedName )
            // InternalOCLinEcore.g:9862: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"
    // InternalOCLinEcore.g:9886:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
    public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateBindingCS = null;


        try {
            // InternalOCLinEcore.g:9887:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
            // InternalOCLinEcore.g:9888: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"
    // InternalOCLinEcore.g:9895: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 {
            // InternalOCLinEcore.g:9898:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
            // InternalOCLinEcore.g:9899:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
            {
            // InternalOCLinEcore.g:9899:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
            // InternalOCLinEcore.g:9899:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
            {
            // InternalOCLinEcore.g:9899:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
            // InternalOCLinEcore.g:9900:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
            {
            // InternalOCLinEcore.g:9900:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
            // InternalOCLinEcore.g:9901:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_130);
            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();

            }

            }


            }

            // InternalOCLinEcore.g:9917:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
            loop217:
            do {
                int alt217=2;
                int LA217_0 = input.LA(1);

                if ( (LA217_0==59) ) {
                    alt217=1;
                }


                switch (alt217) {
            	case 1 :
            	    // InternalOCLinEcore.g:9917:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
            	    {
            	    otherlv_1=(Token)match(input,59,FollowSets000.FOLLOW_88); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());

            	    }
            	    // InternalOCLinEcore.g:9921:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
            	    // InternalOCLinEcore.g:9922:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
            	    {
            	    // InternalOCLinEcore.g:9922:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
            	    // InternalOCLinEcore.g:9923:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_130);
            	    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 loop217;
                }
            } while (true);

            // InternalOCLinEcore.g:9939:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
            int alt218=2;
            int LA218_0 = input.LA(1);

            if ( (LA218_0==124) ) {
                alt218=1;
            }
            switch (alt218) {
                case 1 :
                    // InternalOCLinEcore.g:9940:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                    {
                    // InternalOCLinEcore.g:9940:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                    // InternalOCLinEcore.g:9941: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"
    // InternalOCLinEcore.g:9965:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
    public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateParameterSubstitutionCS = null;


        try {
            // InternalOCLinEcore.g:9966:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
            // InternalOCLinEcore.g:9967: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"
    // InternalOCLinEcore.g:9974: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 {
            // InternalOCLinEcore.g:9977:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
            // InternalOCLinEcore.g:9978:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            {
            // InternalOCLinEcore.g:9978:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            // InternalOCLinEcore.g:9979:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            {
            // InternalOCLinEcore.g:9979:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            // InternalOCLinEcore.g:9980: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 "entryRuleTypeParameterCS"
    // InternalOCLinEcore.g:10004:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
    public final EObject entryRuleTypeParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeParameterCS = null;


        try {
            // InternalOCLinEcore.g:10005:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
            // InternalOCLinEcore.g:10006: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"
    // InternalOCLinEcore.g:10013: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 {
            // InternalOCLinEcore.g:10016:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
            // InternalOCLinEcore.g:10017:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            {
            // InternalOCLinEcore.g:10017:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            // InternalOCLinEcore.g:10017:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            {
            // InternalOCLinEcore.g:10017:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:10018:1: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:10018:1: (lv_name_0_0= ruleUnrestrictedName )
            // InternalOCLinEcore.g:10019:3: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_131);
            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.ocl.xtext.oclinecore.OCLinEcore.UnrestrictedName");
              	        afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalOCLinEcore.g:10035:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            int alt220=2;
            int LA220_0 = input.LA(1);

            if ( (LA220_0==30) ) {
                alt220=1;
            }
            switch (alt220) {
                case 1 :
                    // InternalOCLinEcore.g:10035:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_1=(Token)match(input,30,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());

                    }
                    // InternalOCLinEcore.g:10039:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
                    // InternalOCLinEcore.g:10040:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:10040:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    // InternalOCLinEcore.g:10041:3: lv_ownedExtends_2_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_132);
                    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalOCLinEcore.g:10057:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    loop219:
                    do {
                        int alt219=2;
                        int LA219_0 = input.LA(1);

                        if ( (LA219_0==138) ) {
                            alt219=1;
                        }


                        switch (alt219) {
                    	case 1 :
                    	    // InternalOCLinEcore.g:10057:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,138,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());

                    	    }
                    	    // InternalOCLinEcore.g:10061:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    // InternalOCLinEcore.g:10062:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    {
                    	    // InternalOCLinEcore.g:10062:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    // InternalOCLinEcore.g:10063:3: lv_ownedExtends_4_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_132);
                    	    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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                    	      	        afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleTypeRefCS"
    // InternalOCLinEcore.g:10087:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
    public final EObject entryRuleTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeRefCS = null;


        try {
            // InternalOCLinEcore.g:10088:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
            // InternalOCLinEcore.g:10089: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"
    // InternalOCLinEcore.g:10096: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 {
            // InternalOCLinEcore.g:10099:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
            // InternalOCLinEcore.g:10100:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            {
            // InternalOCLinEcore.g:10100:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( ((LA221_0>=RULE_SIMPLE_ID && LA221_0<=RULE_ESCAPED_ID)||LA221_0==17||(LA221_0>=19 && LA221_0<=53)||LA221_0==58||LA221_0==71||(LA221_0>=73 && LA221_0<=74)||LA221_0==76||LA221_0==80||(LA221_0>=98 && LA221_0<=99)||(LA221_0>=101 && LA221_0<=113)) ) {
                alt221=1;
            }
            else if ( (LA221_0==137) ) {
                alt221=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 221, 0, input);

                throw nvae;
            }
            switch (alt221) {
                case 1 :
                    // InternalOCLinEcore.g:10101: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 :
                    // InternalOCLinEcore.g:10114: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 "entryRuleWildcardTypeRefCS"
    // InternalOCLinEcore.g:10133:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
    public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWildcardTypeRefCS = null;


        try {
            // InternalOCLinEcore.g:10134:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
            // InternalOCLinEcore.g:10135: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"
    // InternalOCLinEcore.g:10142: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 {
            // InternalOCLinEcore.g:10145:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
            // InternalOCLinEcore.g:10146:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            {
            // InternalOCLinEcore.g:10146:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            // InternalOCLinEcore.g:10146:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            {
            // InternalOCLinEcore.g:10146:2: ()
            // InternalOCLinEcore.g:10147:2:
            {
            if ( state.backtracking==0 ) {

              	  /* */

            }
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0(),
                          current);

            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());

            }
            // InternalOCLinEcore.g:10159:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==30) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // InternalOCLinEcore.g:10159:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    {
                    otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());

                    }
                    // InternalOCLinEcore.g:10163:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    // InternalOCLinEcore.g:10164:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:10164:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    // InternalOCLinEcore.g:10165: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.ocl.xtext.oclinecore.OCLinEcore.TypedRefCS");
                      	        afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

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

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


    // $ANTLR start "entryRuleID"
    // InternalOCLinEcore.g:10189:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
    public final String entryRuleID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleID = null;


        try {
            // InternalOCLinEcore.g:10190:2: (iv_ruleID= ruleID EOF )
            // InternalOCLinEcore.g:10191: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"
    // InternalOCLinEcore.g:10198: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 {
            // InternalOCLinEcore.g:10201:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
            // InternalOCLinEcore.g:10202:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            {
            // InternalOCLinEcore.g:10202:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==RULE_SIMPLE_ID) ) {
                alt223=1;
            }
            else if ( (LA223_0==RULE_ESCAPED_ID) ) {
                alt223=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 223, 0, input);

                throw nvae;
            }
            switch (alt223) {
                case 1 :
                    // InternalOCLinEcore.g:10202: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 :
                    // InternalOCLinEcore.g:10210: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"
    // InternalOCLinEcore.g:10225:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
    public final String entryRuleIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdentifier = null;


        try {
            // InternalOCLinEcore.g:10226:2: (iv_ruleIdentifier= ruleIdentifier EOF )
            // InternalOCLinEcore.g:10227: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"
    // InternalOCLinEcore.g:10234: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 {
            // InternalOCLinEcore.g:10237:28: (this_ID_0= ruleID )
            // InternalOCLinEcore.g:10239: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"
    // InternalOCLinEcore.g:10257:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
    public final String entryRuleLOWER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLOWER = null;


        try {
            // InternalOCLinEcore.g:10258:2: (iv_ruleLOWER= ruleLOWER EOF )
            // InternalOCLinEcore.g:10259: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"
    // InternalOCLinEcore.g:10266: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 {
            // InternalOCLinEcore.g:10269:28: (this_INT_0= RULE_INT )
            // InternalOCLinEcore.g:10270: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"
    // InternalOCLinEcore.g:10285: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 {
            // InternalOCLinEcore.g:10286:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
            // InternalOCLinEcore.g:10287: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"
    // InternalOCLinEcore.g:10294: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 {
            // InternalOCLinEcore.g:10297:28: (this_INT_0= RULE_INT )
            // InternalOCLinEcore.g:10298: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"
    // InternalOCLinEcore.g:10313:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
    public final String entryRuleStringLiteral() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleStringLiteral = null;


        try {
            // InternalOCLinEcore.g:10314:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
            // InternalOCLinEcore.g:10315: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"
    // InternalOCLinEcore.g:10322: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 {
            // InternalOCLinEcore.g:10325:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:10326: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"
    // InternalOCLinEcore.g:10341:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
    public final String entryRuleUPPER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUPPER = null;


        try {
            // InternalOCLinEcore.g:10342:2: (iv_ruleUPPER= ruleUPPER EOF )
            // InternalOCLinEcore.g:10343: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"
    // InternalOCLinEcore.g:10350: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 {
            // InternalOCLinEcore.g:10353:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
            // InternalOCLinEcore.g:10354:1: (this_INT_0= RULE_INT | kw= '*' )
            {
            // InternalOCLinEcore.g:10354:1: (this_INT_0= RULE_INT | kw= '*' )
            int alt224=2;
            int LA224_0 = input.LA(1);

            if ( (LA224_0==RULE_INT) ) {
                alt224=1;
            }
            else if ( (LA224_0==84) ) {
                alt224=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 224, 0, input);

                throw nvae;
            }
            switch (alt224) {
                case 1 :
                    // InternalOCLinEcore.g:10354: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 :
                    // InternalOCLinEcore.g:10363:2: kw= '*'
                    {
                    kw=(Token)match(input,84,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"
    // InternalOCLinEcore.g:10376:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
    public final String entryRuleURI() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleURI = null;


        try {
            // InternalOCLinEcore.g:10377:2: (iv_ruleURI= ruleURI EOF )
            // InternalOCLinEcore.g:10378: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"
    // InternalOCLinEcore.g:10385: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 {
            // InternalOCLinEcore.g:10388:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:10389: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 synpred315_InternalOCLinEcore
    public final void synpred315_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_TypeLiteralCS_1 = null;


        // InternalOCLinEcore.g:7478:2: (this_TypeLiteralCS_1= ruleTypeLiteralCS )
        // InternalOCLinEcore.g:7478: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 synpred315_InternalOCLinEcore

    // $ANTLR start synpred318_InternalOCLinEcore
    public final void synpred318_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_PrefixedPrimaryExpCS_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedRight_3_0 = null;


        // InternalOCLinEcore.g:7574:2: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) )
        // InternalOCLinEcore.g:7574:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        {
        // InternalOCLinEcore.g:7574:2: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        // InternalOCLinEcore.g:7575:2: this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        {
        if ( state.backtracking==0 ) {

          	  /* */

        }
        pushFollow(FollowSets000.FOLLOW_107);
        this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

        state._fsp--;
        if (state.failed) return ;
        // InternalOCLinEcore.g:7586:1: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        int alt313=2;
        int LA313_0 = input.LA(1);

        if ( (LA313_0==18||LA313_0==62||(LA313_0>=81 && LA313_0<=82)||(LA313_0>=84 && LA313_0<=97)) ) {
            alt313=1;
        }
        switch (alt313) {
            case 1 :
                // InternalOCLinEcore.g:7586:2: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                {
                // InternalOCLinEcore.g:7586:2: ()
                // InternalOCLinEcore.g:7587:2:
                {
                if ( state.backtracking==0 ) {

                  	  /* */

                }

                }

                // InternalOCLinEcore.g:7595:2: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                // InternalOCLinEcore.g:7596:1: (lv_name_2_0= ruleBinaryOperatorName )
                {
                // InternalOCLinEcore.g:7596:1: (lv_name_2_0= ruleBinaryOperatorName )
                // InternalOCLinEcore.g:7597:3: lv_name_2_0= ruleBinaryOperatorName
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_100);
                lv_name_2_0=ruleBinaryOperatorName();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalOCLinEcore.g:7613:2: ( (lv_ownedRight_3_0= ruleExpCS ) )
                // InternalOCLinEcore.g:7614:1: (lv_ownedRight_3_0= ruleExpCS )
                {
                // InternalOCLinEcore.g:7614:1: (lv_ownedRight_3_0= ruleExpCS )
                // InternalOCLinEcore.g:7615: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 synpred318_InternalOCLinEcore

    // $ANTLR start synpred325_InternalOCLinEcore
    public final void synpred325_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_TupleLiteralExpCS_4 = null;


        // InternalOCLinEcore.g:7876:2: (this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS )
        // InternalOCLinEcore.g:7876: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 synpred325_InternalOCLinEcore

    // $ANTLR start synpred326_InternalOCLinEcore
    public final void synpred326_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_MapLiteralExpCS_5 = null;


        // InternalOCLinEcore.g:7889:2: (this_MapLiteralExpCS_5= ruleMapLiteralExpCS )
        // InternalOCLinEcore.g:7889: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 synpred326_InternalOCLinEcore

    // $ANTLR start synpred327_InternalOCLinEcore
    public final void synpred327_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_CollectionLiteralExpCS_6 = null;


        // InternalOCLinEcore.g:7902:2: (this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS )
        // InternalOCLinEcore.g:7902: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 synpred327_InternalOCLinEcore

    // $ANTLR start synpred329_InternalOCLinEcore
    public final void synpred329_InternalOCLinEcore_fragment() throws RecognitionException {
        EObject this_TypeLiteralExpCS_8 = null;


        // InternalOCLinEcore.g:7928:2: (this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS )
        // InternalOCLinEcore.g:7928: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 synpred329_InternalOCLinEcore

    // $ANTLR start synpred342_InternalOCLinEcore
    public final void synpred342_InternalOCLinEcore_fragment() throws RecognitionException {
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedCoIterator_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;


        // InternalOCLinEcore.g:8357:3: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) )
        // InternalOCLinEcore.g:8357:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        {
        // InternalOCLinEcore.g:8357:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        // InternalOCLinEcore.g:8357:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        {
        otherlv_1=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
        // InternalOCLinEcore.g:8361:1: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
        // InternalOCLinEcore.g:8362:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        {
        // InternalOCLinEcore.g:8362:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        // InternalOCLinEcore.g:8363:3: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_116);
        lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalOCLinEcore.g:8379:2: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        int alt318=2;
        int LA318_0 = input.LA(1);

        if ( (LA318_0==62) ) {
            alt318=1;
        }
        switch (alt318) {
            case 1 :
                // InternalOCLinEcore.g:8379:4: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                {
                otherlv_3=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return ;
                // InternalOCLinEcore.g:8383:1: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                // InternalOCLinEcore.g:8384:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                {
                // InternalOCLinEcore.g:8384:1: (lv_ownedInitExpression_4_0= ruleExpCS )
                // InternalOCLinEcore.g:8385: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 synpred342_InternalOCLinEcore

    // $ANTLR start synpred345_InternalOCLinEcore
    public final void synpred345_InternalOCLinEcore_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;


        // InternalOCLinEcore.g:8402:6: ( (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) )
        // InternalOCLinEcore.g:8402:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        {
        // InternalOCLinEcore.g:8402:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        // InternalOCLinEcore.g:8402: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,56,FollowSets000.FOLLOW_29); if (state.failed) return ;
        // InternalOCLinEcore.g:8406:1: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
        // InternalOCLinEcore.g:8407:1: (lv_ownedType_6_0= ruleTypeExpCS )
        {
        // InternalOCLinEcore.g:8407:1: (lv_ownedType_6_0= ruleTypeExpCS )
        // InternalOCLinEcore.g:8408:3: lv_ownedType_6_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_117);
        lv_ownedType_6_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalOCLinEcore.g:8424:2: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
        int alt319=2;
        int LA319_0 = input.LA(1);

        if ( (LA319_0==117) ) {
            alt319=1;
        }
        switch (alt319) {
            case 1 :
                // InternalOCLinEcore.g:8424:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_7=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
                // InternalOCLinEcore.g:8428:1: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                // InternalOCLinEcore.g:8429:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                {
                // InternalOCLinEcore.g:8429:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                // InternalOCLinEcore.g:8430:3: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_116);
                lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalOCLinEcore.g:8446:4: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
        int alt320=2;
        int LA320_0 = input.LA(1);

        if ( (LA320_0==62) ) {
            alt320=1;
        }
        switch (alt320) {
            case 1 :
                // InternalOCLinEcore.g:8446:6: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                {
                otherlv_9=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return ;
                // InternalOCLinEcore.g:8450:1: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                // InternalOCLinEcore.g:8451:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                {
                // InternalOCLinEcore.g:8451:1: (lv_ownedInitExpression_10_0= ruleExpCS )
                // InternalOCLinEcore.g:8452: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 synpred345_InternalOCLinEcore

    // $ANTLR start synpred348_InternalOCLinEcore
    public final void synpred348_InternalOCLinEcore_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;


        // InternalOCLinEcore.g:8469:6: ( ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )
        // InternalOCLinEcore.g:8469:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        {
        // InternalOCLinEcore.g:8469:6: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        // InternalOCLinEcore.g:8469:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        {
        // InternalOCLinEcore.g:8469:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
        int alt321=2;
        int LA321_0 = input.LA(1);

        if ( (LA321_0==56) ) {
            alt321=1;
        }
        switch (alt321) {
            case 1 :
                // InternalOCLinEcore.g:8469:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                {
                otherlv_11=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return ;
                // InternalOCLinEcore.g:8473:1: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                // InternalOCLinEcore.g:8474:1: (lv_ownedType_12_0= ruleTypeExpCS )
                {
                // InternalOCLinEcore.g:8474:1: (lv_ownedType_12_0= ruleTypeExpCS )
                // InternalOCLinEcore.g:8475:3: lv_ownedType_12_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_118);
                lv_ownedType_12_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalOCLinEcore.g:8491:4: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
        int alt322=2;
        int LA322_0 = input.LA(1);

        if ( (LA322_0==117) ) {
            alt322=1;
        }
        switch (alt322) {
            case 1 :
                // InternalOCLinEcore.g:8491:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_13=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
                // InternalOCLinEcore.g:8495:1: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                // InternalOCLinEcore.g:8496:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                {
                // InternalOCLinEcore.g:8496:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                // InternalOCLinEcore.g:8497:3: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_119);
                lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_15=(Token)match(input,126,FollowSets000.FOLLOW_100); if (state.failed) return ;
        // InternalOCLinEcore.g:8517:1: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        // InternalOCLinEcore.g:8518:1: (lv_ownedInitExpression_16_0= ruleExpCS )
        {
        // InternalOCLinEcore.g:8518:1: (lv_ownedInitExpression_16_0= ruleExpCS )
        // InternalOCLinEcore.g:8519: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 synpred348_InternalOCLinEcore

    // $ANTLR start synpred353_InternalOCLinEcore
    public final void synpred353_InternalOCLinEcore_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedCoIterator_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


        // InternalOCLinEcore.g:8710:3: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) )
        // InternalOCLinEcore.g:8710:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        {
        // InternalOCLinEcore.g:8710:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        // InternalOCLinEcore.g:8710:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        {
        otherlv_2=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
        // InternalOCLinEcore.g:8714:1: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
        // InternalOCLinEcore.g:8715:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        {
        // InternalOCLinEcore.g:8715:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        // InternalOCLinEcore.g:8716:3: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_116);
        lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalOCLinEcore.g:8732:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        int alt330=2;
        int LA330_0 = input.LA(1);

        if ( (LA330_0==62) ) {
            alt330=1;
        }
        switch (alt330) {
            case 1 :
                // InternalOCLinEcore.g:8732:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                {
                otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return ;
                // InternalOCLinEcore.g:8736:1: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                // InternalOCLinEcore.g:8737:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                {
                // InternalOCLinEcore.g:8737:1: (lv_ownedInitExpression_5_0= ruleExpCS )
                // InternalOCLinEcore.g:8738: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 synpred353_InternalOCLinEcore

    // $ANTLR start synpred356_InternalOCLinEcore
    public final void synpred356_InternalOCLinEcore_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;


        // InternalOCLinEcore.g:8755:6: ( (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) )
        // InternalOCLinEcore.g:8755:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        {
        // InternalOCLinEcore.g:8755:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        // InternalOCLinEcore.g:8755: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,56,FollowSets000.FOLLOW_29); if (state.failed) return ;
        // InternalOCLinEcore.g:8759:1: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
        // InternalOCLinEcore.g:8760:1: (lv_ownedType_7_0= ruleTypeExpCS )
        {
        // InternalOCLinEcore.g:8760:1: (lv_ownedType_7_0= ruleTypeExpCS )
        // InternalOCLinEcore.g:8761:3: lv_ownedType_7_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_117);
        lv_ownedType_7_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalOCLinEcore.g:8777:2: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
        int alt331=2;
        int LA331_0 = input.LA(1);

        if ( (LA331_0==117) ) {
            alt331=1;
        }
        switch (alt331) {
            case 1 :
                // InternalOCLinEcore.g:8777:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_8=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
                // InternalOCLinEcore.g:8781:1: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                // InternalOCLinEcore.g:8782:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                {
                // InternalOCLinEcore.g:8782:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                // InternalOCLinEcore.g:8783:3: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_116);
                lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalOCLinEcore.g:8799:4: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
        int alt332=2;
        int LA332_0 = input.LA(1);

        if ( (LA332_0==62) ) {
            alt332=1;
        }
        switch (alt332) {
            case 1 :
                // InternalOCLinEcore.g:8799:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                {
                otherlv_10=(Token)match(input,62,FollowSets000.FOLLOW_100); if (state.failed) return ;
                // InternalOCLinEcore.g:8803:1: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                // InternalOCLinEcore.g:8804:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                {
                // InternalOCLinEcore.g:8804:1: (lv_ownedInitExpression_11_0= ruleExpCS )
                // InternalOCLinEcore.g:8805: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 synpred356_InternalOCLinEcore

    // $ANTLR start synpred359_InternalOCLinEcore
    public final void synpred359_InternalOCLinEcore_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;


        // InternalOCLinEcore.g:8822:6: ( ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )
        // InternalOCLinEcore.g:8822:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        {
        // InternalOCLinEcore.g:8822:6: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        // InternalOCLinEcore.g:8822:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        {
        // InternalOCLinEcore.g:8822:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
        int alt333=2;
        int LA333_0 = input.LA(1);

        if ( (LA333_0==56) ) {
            alt333=1;
        }
        switch (alt333) {
            case 1 :
                // InternalOCLinEcore.g:8822:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                {
                otherlv_12=(Token)match(input,56,FollowSets000.FOLLOW_29); if (state.failed) return ;
                // InternalOCLinEcore.g:8826:1: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                // InternalOCLinEcore.g:8827:1: (lv_ownedType_13_0= ruleTypeExpCS )
                {
                // InternalOCLinEcore.g:8827:1: (lv_ownedType_13_0= ruleTypeExpCS )
                // InternalOCLinEcore.g:8828:3: lv_ownedType_13_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_118);
                lv_ownedType_13_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalOCLinEcore.g:8844:4: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
        int alt334=2;
        int LA334_0 = input.LA(1);

        if ( (LA334_0==117) ) {
            alt334=1;
        }
        switch (alt334) {
            case 1 :
                // InternalOCLinEcore.g:8844:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_14=(Token)match(input,117,FollowSets000.FOLLOW_3); if (state.failed) return ;
                // InternalOCLinEcore.g:8848:1: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                // InternalOCLinEcore.g:8849:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                {
                // InternalOCLinEcore.g:8849:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                // InternalOCLinEcore.g:8850:3: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_119);
                lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_16=(Token)match(input,126,FollowSets000.FOLLOW_100); if (state.failed) return ;
        // InternalOCLinEcore.g:8870:1: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        // InternalOCLinEcore.g:8871:1: (lv_ownedInitExpression_17_0= ruleExpCS )
        {
        // InternalOCLinEcore.g:8871:1: (lv_ownedInitExpression_17_0= ruleExpCS )
        // InternalOCLinEcore.g:8872: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 synpred359_InternalOCLinEcore

    // Delegated rules

    public final boolean synpred348_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred348_InternalOCLinEcore_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 synpred315_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred315_InternalOCLinEcore_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 synpred326_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred326_InternalOCLinEcore_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 synpred359_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred359_InternalOCLinEcore_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 synpred356_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred356_InternalOCLinEcore_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 synpred329_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred329_InternalOCLinEcore_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 synpred327_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred327_InternalOCLinEcore_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 synpred342_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred342_InternalOCLinEcore_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 synpred325_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred325_InternalOCLinEcore_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 synpred345_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred345_InternalOCLinEcore_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 synpred353_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred353_InternalOCLinEcore_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 synpred318_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred318_InternalOCLinEcore_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 DFA65 dfa65 = new DFA65(this);
    protected DFA67 dfa67 = new DFA67(this);
    protected DFA125 dfa125 = new DFA125(this);
    protected DFA155 dfa155 = new DFA155(this);
    protected DFA158 dfa158 = new DFA158(this);
    protected DFA172 dfa172 = new DFA172(this);
    protected DFA175 dfa175 = new DFA175(this);
    protected DFA178 dfa178 = new DFA178(this);
    protected DFA194 dfa194 = new DFA194(this);
    protected DFA203 dfa203 = new DFA203(this);
    protected DFA207 dfa207 = new DFA207(this);
    static final String dfa_1s = "\57\uffff";
    static final String dfa_2s = "\1\5\54\70\2\uffff";
    static final String dfa_3s = "\1\120\54\144\2\uffff";
    static final String dfa_4s = "\55\uffff\1\2\1\1";
    static final String dfa_5s = "\57\uffff}>";
    static final String[] dfa_6s = {
            "\1\55\2\uffff\1\1\1\2\7\uffff\1\25\1\uffff\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\50\4\uffff\1\46\14\uffff\1\53\1\uffff\1\47\1\51\1\uffff\1\52\3\uffff\1\54",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "\1\56\1\55\21\uffff\1\55\30\uffff\1\55",
            "",
            ""
    };

    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 DFA65 extends DFA {

        public DFA65(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 65;
            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 "2363:2: ( ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= ':' )?";
        }
    }
    static final String dfa_7s = "\23\uffff";
    static final String dfa_8s = "\1\10\1\27\1\10\1\31\2\10\1\uffff\1\10\1\24\3\10\1\24\2\uffff\1\24\2\uffff\1\24";
    static final String dfa_9s = "\1\112\1\76\1\120\1\76\2\120\1\uffff\1\120\1\76\1\121\2\120\1\76\2\uffff\1\53\2\uffff\1\53";
    static final String dfa_10s = "\6\uffff\1\2\6\uffff\1\1\1\5\1\uffff\1\3\1\4\1\uffff";
    static final String dfa_11s = "\23\uffff}>";
    static final String[] dfa_12s = {
            "\2\6\7\uffff\1\6\1\uffff\1\1\1\7\2\6\1\2\1\6\1\4\1\10\2\6\1\5\7\6\1\11\1\6\1\12\2\6\1\3\1\13\3\6\1\14\5\6\25\uffff\1\6",
            "\1\15\40\uffff\2\6\2\uffff\1\6\1\uffff\1\6",
            "\2\15\7\uffff\1\15\1\uffff\43\15\2\uffff\2\6\1\15\1\uffff\1\6\1\uffff\1\6\10\uffff\1\15\1\uffff\2\15\1\uffff\1\15\3\uffff\1\15",
            "\1\15\36\uffff\2\6\2\uffff\1\6\1\uffff\1\6",
            "\2\15\7\uffff\1\15\1\uffff\43\15\2\uffff\2\6\1\15\1\uffff\1\6\1\uffff\1\6\10\uffff\1\15\1\uffff\2\15\1\uffff\1\15\3\uffff\1\15",
            "\2\15\7\uffff\1\15\1\uffff\43\15\2\uffff\2\6\1\15\1\uffff\1\6\1\uffff\1\6\10\uffff\1\15\1\uffff\2\15\1\uffff\1\15\3\uffff\1\15",
            "",
            "\2\16\7\uffff\1\16\1\uffff\43\16\2\uffff\2\6\1\16\1\uffff\1\6\1\uffff\1\6\10\uffff\1\16\1\uffff\2\16\1\uffff\1\16\3\uffff\1\16",
            "\1\16\20\uffff\1\20\5\uffff\1\16\3\uffff\1\17\10\uffff\2\6\2\uffff\1\6\1\uffff\1\6",
            "\2\20\7\uffff\1\20\1\uffff\44\20\1\uffff\2\6\1\20\1\uffff\1\6\1\uffff\1\6\10\uffff\1\20\1\uffff\2\20\1\uffff\1\20\3\uffff\2\20",
            "\2\21\7\uffff\1\21\1\uffff\43\21\2\uffff\2\6\1\21\1\uffff\1\6\1\uffff\1\6\10\uffff\1\21\1\uffff\2\21\1\uffff\1\21\3\uffff\1\21",
            "\2\16\7\uffff\1\16\1\uffff\43\16\2\uffff\2\6\1\16\1\uffff\1\6\1\uffff\1\6\10\uffff\1\16\1\uffff\2\16\1\uffff\1\16\3\uffff\1\16",
            "\1\16\5\uffff\1\22\12\uffff\1\20\5\uffff\1\16\14\uffff\2\6\2\uffff\1\6\1\uffff\1\6",
            "",
            "",
            "\1\16\20\uffff\1\20\5\uffff\1\16",
            "",
            "",
            "\1\16\20\uffff\1\20\5\uffff\1\16"
    };

    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 DFA67 extends DFA {

        public DFA67(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 67;
            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 "2443:1: (this_ClassCS_0= ruleClassCS | this_EnumerationLiteralCS_1= ruleEnumerationLiteralCS | this_OperationCS_2= ruleOperationCS | this_PackageCS_3= rulePackageCS | this_StructuralFeatureCS_4= ruleStructuralFeatureCS )";
        }
    }
    static final String dfa_13s = "\12\uffff";
    static final String dfa_14s = "\1\24\2\uffff\2\24\3\uffff\2\24";
    static final String dfa_15s = "\1\120\2\uffff\1\53\1\57\3\uffff\2\53";
    static final String dfa_16s = "\1\uffff\1\5\1\1\2\uffff\1\2\1\3\1\4\2\uffff";
    static final String dfa_17s = "\12\uffff}>";
    static final String[] dfa_18s = {
            "\1\6\1\uffff\1\7\3\uffff\1\4\12\uffff\1\5\5\uffff\1\6\3\uffff\1\3\5\uffff\1\7\4\uffff\1\2\2\uffff\1\1\13\uffff\1\2\6\uffff\1\2",
            "",
            "",
            "\1\6\5\uffff\1\10\12\uffff\1\5\5\uffff\1\6",
            "\1\6\20\uffff\1\5\5\uffff\1\6\3\uffff\1\11",
            "",
            "",
            "",
            "\1\6\20\uffff\1\5\5\uffff\1\6",
            "\1\6\20\uffff\1\5\5\uffff\1\6"
    };

    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
    static final char[] dfa_14 = DFA.unpackEncodedStringToUnsignedChars(dfa_14s);
    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
    static final short[] dfa_16 = DFA.unpackEncodedString(dfa_16s);
    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[][] dfa_18 = unpackEncodedStringArray(dfa_18s);

    class DFA125 extends DFA {

        public DFA125(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 125;
            this.eot = dfa_13;
            this.eof = dfa_13;
            this.min = dfa_14;
            this.max = dfa_15;
            this.accept = dfa_16;
            this.special = dfa_17;
            this.transition = dfa_18;
        }
        public String getDescription() {
            return "()* loopback of 4381:1: ( ( (lv_ownedAnnotations_14_0= ruleAnnotationElementCS ) ) | ( (lv_ownedOperations_15_0= ruleOperationCS ) ) | ( (lv_ownedProperties_16_0= ruleStructuralFeatureCS ) ) | ( (lv_ownedConstraints_17_0= ruleInvariantConstraintCS ) ) )*";
        }
    }
    static final String dfa_19s = "\2\uffff\54\1\1\uffff";
    static final String dfa_20s = "\1\4\1\uffff\54\22\1\uffff";
    static final String dfa_21s = "\1\u0086\1\uffff\54\174\1\uffff";
    static final String dfa_22s = "\1\uffff\1\1\54\uffff\1\2";
    static final String[] dfa_23s = {
            "\2\1\2\uffff\1\2\1\3\7\uffff\1\26\1\1\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\51\1\1\1\uffff\1\56\1\uffff\1\47\14\uffff\1\54\1\uffff\1\50\1\52\1\uffff\1\53\3\uffff\1\55\2\uffff\2\1\15\uffff\2\1\1\uffff\15\1\2\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\15\uffff\1\1\7\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
    static final char[] dfa_20 = DFA.unpackEncodedStringToUnsignedChars(dfa_20s);
    static final char[] dfa_21 = DFA.unpackEncodedStringToUnsignedChars(dfa_21s);
    static final short[] dfa_22 = DFA.unpackEncodedString(dfa_22s);
    static final short[][] dfa_23 = unpackEncodedStringArray(dfa_23s);

    class DFA155 extends DFA {

        public DFA155(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 155;
            this.eot = dfa_1;
            this.eof = dfa_19;
            this.min = dfa_20;
            this.max = dfa_21;
            this.accept = dfa_22;
            this.special = dfa_5;
            this.transition = dfa_23;
        }
        public String getDescription() {
            return "6186:1: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )";
        }
    }
    static final String[] dfa_24s = {
            "\2\1\2\uffff\1\2\1\3\7\uffff\1\26\1\1\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\51\1\1\1\uffff\1\56\1\uffff\1\47\14\uffff\1\54\1\uffff\1\50\1\52\1\uffff\1\53\3\uffff\1\55\2\uffff\2\1\15\uffff\2\1\1\uffff\15\1\2\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\2\uffff\4\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[][] dfa_24 = unpackEncodedStringArray(dfa_24s);

    class DFA158 extends DFA {

        public DFA158(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 158;
            this.eot = dfa_1;
            this.eof = dfa_19;
            this.min = dfa_20;
            this.max = dfa_21;
            this.accept = dfa_22;
            this.special = dfa_5;
            this.transition = dfa_24;
        }
        public String getDescription() {
            return "6399:1: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )";
        }
    }
    static final String dfa_25s = "\75\uffff";
    static final String dfa_26s = "\1\10\64\uffff\5\0\3\uffff";
    static final String dfa_27s = "\1\161\64\uffff\5\0\3\uffff";
    static final String dfa_28s = "\1\uffff\1\1\53\uffff\1\2\16\uffff\1\3";
    static final String dfa_29s = "\65\uffff\1\0\1\1\1\2\1\3\1\4\3\uffff}>";
    static final String[] dfa_30s = {
            "\2\1\7\uffff\1\1\1\uffff\43\1\4\uffff\1\1\14\uffff\1\1\1\uffff\2\1\1\uffff\1\1\3\uffff\1\1\21\uffff\2\55\1\uffff\10\55\1\65\1\66\1\67\1\70\1\71",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            ""
    };

    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
    static final char[] dfa_26 = DFA.unpackEncodedStringToUnsignedChars(dfa_26s);
    static final char[] dfa_27 = DFA.unpackEncodedStringToUnsignedChars(dfa_27s);
    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
    static final short[][] dfa_30 = unpackEncodedStringArray(dfa_30s);

    class DFA172 extends DFA {

        public DFA172(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 172;
            this.eot = dfa_25;
            this.eof = dfa_25;
            this.min = dfa_26;
            this.max = dfa_27;
            this.accept = dfa_28;
            this.special = dfa_29;
            this.transition = dfa_30;
        }
        public String getDescription() {
            return "7464: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 LA172_53 = input.LA(1);


                        int index172_53 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred315_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index172_53);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA172_54 = input.LA(1);


                        int index172_54 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred315_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index172_54);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA172_55 = input.LA(1);


                        int index172_55 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred315_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index172_55);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA172_56 = input.LA(1);


                        int index172_56 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred315_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index172_56);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA172_57 = input.LA(1);


                        int index172_57 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred315_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index172_57);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 172, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_31s = "\112\uffff";
    static final String dfa_32s = "\1\4\2\0\107\uffff";
    static final String dfa_33s = "\1\u0086\2\0\107\uffff";
    static final String dfa_34s = "\3\uffff\1\1\105\uffff\1\2";
    static final String dfa_35s = "\1\uffff\1\0\1\1\107\uffff}>";
    static final String[] dfa_36s = {
            "\2\3\2\uffff\2\3\7\uffff\1\3\1\1\44\3\3\uffff\1\3\14\uffff\1\3\1\uffff\2\3\1\uffff\1\3\3\uffff\1\3\2\uffff\1\2\1\3\15\uffff\2\3\1\uffff\15\3\2\uffff\1\3\1\uffff\4\3\6\uffff\1\3\4\uffff\1\111\1\3",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final char[] dfa_32 = DFA.unpackEncodedStringToUnsignedChars(dfa_32s);
    static final char[] dfa_33 = DFA.unpackEncodedStringToUnsignedChars(dfa_33s);
    static final short[] dfa_34 = DFA.unpackEncodedString(dfa_34s);
    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
    static final short[][] dfa_36 = unpackEncodedStringArray(dfa_36s);

    class DFA175 extends DFA {

        public DFA175(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 175;
            this.eot = dfa_31;
            this.eof = dfa_31;
            this.min = dfa_32;
            this.max = dfa_33;
            this.accept = dfa_34;
            this.special = dfa_35;
            this.transition = dfa_36;
        }
        public String getDescription() {
            return "7574: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 LA175_1 = input.LA(1);


                        int index175_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred318_InternalOCLinEcore()) ) {s = 3;}

                        else if ( (true) ) {s = 73;}


                        input.seek(index175_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA175_2 = input.LA(1);


                        int index175_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred318_InternalOCLinEcore()) ) {s = 3;}

                        else if ( (true) ) {s = 73;}


                        input.seek(index175_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 175, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_37s = "\1\4\12\uffff\7\0\70\uffff";
    static final String dfa_38s = "\1\u0086\12\uffff\7\0\70\uffff";
    static final String dfa_39s = "\1\uffff\1\1\1\2\1\3\1\4\15\uffff\1\10\1\11\7\uffff\1\12\53\uffff\1\5\1\6\1\7";
    static final String dfa_40s = "\13\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\70\uffff}>";
    static final String[] dfa_41s = {
            "\2\4\2\uffff\2\33\7\uffff\1\33\1\uffff\43\33\1\1\3\uffff\1\33\14\uffff\1\33\1\uffff\2\33\1\uffff\1\33\3\uffff\1\33\3\uffff\1\4\15\uffff\1\14\1\13\1\uffff\10\23\1\15\1\16\1\17\1\20\1\21\2\uffff\1\22\1\uffff\4\4\6\uffff\1\2\5\uffff\1\3",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    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 DFA178 extends DFA {

        public DFA178(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 178;
            this.eot = dfa_31;
            this.eof = dfa_31;
            this.min = dfa_37;
            this.max = dfa_38;
            this.accept = dfa_39;
            this.special = dfa_40;
            this.transition = dfa_41;
        }
        public String getDescription() {
            return "7823: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 LA178_11 = input.LA(1);


                        int index178_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred325_InternalOCLinEcore()) ) {s = 71;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_11);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA178_12 = input.LA(1);


                        int index178_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred326_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_12);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA178_13 = input.LA(1);


                        int index178_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred327_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_13);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA178_14 = input.LA(1);


                        int index178_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred327_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_14);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA178_15 = input.LA(1);


                        int index178_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred327_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_15);
                        if ( s>=0 ) return s;
                        break;
                    case 5 :
                        int LA178_16 = input.LA(1);


                        int index178_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred327_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_16);
                        if ( s>=0 ) return s;
                        break;
                    case 6 :
                        int LA178_17 = input.LA(1);


                        int index178_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred327_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred329_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index178_17);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 178, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_42s = "\13\uffff";
    static final String dfa_43s = "\1\4\12\uffff";
    static final String dfa_44s = "\1\67\2\0\10\uffff";
    static final String dfa_45s = "\1\177\2\0\10\uffff";
    static final String dfa_46s = "\3\uffff\1\3\1\4\4\uffff\1\1\1\2";
    static final String dfa_47s = "\1\uffff\1\0\1\1\10\uffff}>";
    static final String[] dfa_48s = {
            "\1\4\1\2\1\4\1\uffff\1\4\71\uffff\1\1\10\uffff\1\3\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_42 = DFA.unpackEncodedString(dfa_42s);
    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
    static final char[] dfa_44 = DFA.unpackEncodedStringToUnsignedChars(dfa_44s);
    static final char[] dfa_45 = DFA.unpackEncodedStringToUnsignedChars(dfa_45s);
    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
    static final short[] dfa_47 = DFA.unpackEncodedString(dfa_47s);
    static final short[][] dfa_48 = unpackEncodedStringArray(dfa_48s);

    class DFA194 extends DFA {

        public DFA194(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 194;
            this.eot = dfa_42;
            this.eof = dfa_43;
            this.min = dfa_44;
            this.max = dfa_45;
            this.accept = dfa_46;
            this.special = dfa_47;
            this.transition = dfa_48;
        }
        public String getDescription() {
            return "8357: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 LA194_1 = input.LA(1);


                        int index194_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred342_InternalOCLinEcore()) ) {s = 9;}

                        else if ( (synpred348_InternalOCLinEcore()) ) {s = 3;}


                        input.seek(index194_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA194_2 = input.LA(1);


                        int index194_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred345_InternalOCLinEcore()) ) {s = 10;}

                        else if ( (synpred348_InternalOCLinEcore()) ) {s = 3;}


                        input.seek(index194_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 194, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA203 extends DFA {

        public DFA203(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 203;
            this.eot = dfa_42;
            this.eof = dfa_43;
            this.min = dfa_44;
            this.max = dfa_45;
            this.accept = dfa_46;
            this.special = dfa_47;
            this.transition = dfa_48;
        }
        public String getDescription() {
            return "8710: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 LA203_1 = input.LA(1);


                        int index203_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred353_InternalOCLinEcore()) ) {s = 9;}

                        else if ( (synpred359_InternalOCLinEcore()) ) {s = 3;}


                        input.seek(index203_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA203_2 = input.LA(1);


                        int index203_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred356_InternalOCLinEcore()) ) {s = 10;}

                        else if ( (synpred359_InternalOCLinEcore()) ) {s = 3;}


                        input.seek(index203_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 203, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_49s = "\1\u0086\1\uffff\54\u0081\1\uffff";
    static final String[] dfa_50s = {
            "\2\1\2\uffff\1\2\1\3\7\uffff\1\26\1\1\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\51\1\1\1\uffff\1\56\1\uffff\1\47\14\uffff\1\54\1\uffff\1\50\1\52\1\uffff\1\53\3\uffff\1\55\2\uffff\2\1\15\uffff\2\1\1\uffff\15\1\2\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\1\43\uffff\1\1\1\uffff\1\56\3\uffff\1\1\1\uffff\1\1\22\uffff\2\1\1\uffff\16\1\2\uffff\1\1\25\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            ""
    };
    static final char[] dfa_49 = DFA.unpackEncodedStringToUnsignedChars(dfa_49s);
    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);

    class DFA207 extends DFA {

        public DFA207(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 207;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_20;
            this.max = dfa_49;
            this.accept = dfa_22;
            this.special = dfa_5;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "9107: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[]{0x043FFFFFFFFA0300L,0x0000000000011680L});
        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000009100000002L});
        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000008000000002L});
        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000000010L});
        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0020000000000000L});
        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x073FFFFFFFFA0300L,0x0000000000011680L});
        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0340000000000000L});
        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x047FFFFFFFFE03B0L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0080000000000000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0300000000000000L});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x067FFFFFFFFE03B0L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0200000000000000L});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x053FFFFFFFFA0300L,0x0000000000011680L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0140000000000000L});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0100000000000000L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x167FFFFFFFFA0320L,0x0000000000011680L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x1240000000000000L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x043FFFFFFFFA0320L,0x0000000000011680L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0880000000000000L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x1200000000000000L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x041FFFFFFFFA0300L,0x0000000000010600L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x241FFFFFFFFA0300L,0x0000000000010600L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000004100000L});
        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000000100000L});
        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000800000100000L});
        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x5300000000000000L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x047FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000041L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x5200000000000000L});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000020L});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x801E104090000000L,0x000000000000007FL});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0xA81E104090000000L,0x000000000000007FL});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0xA01E104090000000L,0x000000000000007FL});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x2400000208000000L,0x0000000000010200L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000002000000L});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x1340000000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x1300000000000000L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x2000000000000000L,0x0000000000000180L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x2000000000000000L});
        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x2420000000400000L,0x0000000000010200L});
        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x4000000000000000L});
        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000062L});
        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0240000000000020L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0240000000000000L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x243FFFFFFFFA0300L,0x0000000000010600L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000040010L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x2400000000000000L,0x0000000000010200L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0200000000000000L,0x0000000000000800L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000002004000000L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000002000000000L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000802000000000L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x047FFFFFFFFA0300L,0x0000000000031680L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0040000000000000L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x04BFFFFFFFFA0300L,0x0000000000011680L});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x1301000000000000L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x1201000000000000L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x1A00000000000000L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x8006004010000000L,0x000000000000001AL});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0xA806004010000000L,0x000000000000001AL});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0xA006004010000000L,0x000000000000001AL});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x2400030000200000L,0x0000000000010200L});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x2400048022880000L,0x0000000000010200L});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x1100000000000002L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x1000000000000002L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0004004000000000L,0x0000000000000012L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x2804004000000000L,0x0000000000000012L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x2004004000000000L,0x0000000000000012L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000080004000000L});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000080000000000L});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000880000000000L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x5300000000000000L,0x0000000000002000L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x801E504011000000L,0x000000000000C07EL});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0xA81E504011000000L,0x000000000000C07EL});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0xA01E504011000000L,0x000000000000C07EL});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x2400000A08000000L,0x0000000000011200L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0A00000000000000L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000800000L});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x1340000040000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x1300000040000000L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x1B00000000000000L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x2000000400000000L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x143FFFFFFFFA0320L,0x0000000000011680L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x243FFFFFFFFA0320L,0x0000000000011680L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000002L,0x1000000000000000L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0800000000000000L,0x0000000000040000L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0040000000000002L,0x0000000000020000L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x047FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000241L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000002L,0x0000001000000000L});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x043FFFFFFFFA0300L,0x0003FFEC00011680L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0040000000000002L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0080000000000000L,0x1000000000000000L});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0800000000000000L});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x1000000000000000L});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x257FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x2800000000000000L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x057FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000002L,0x0004000000000000L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x047FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0800000000000000L,0x0008000000000000L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000300L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x247FFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x4100000000000000L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000022L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x4000000000040002L,0x00000003FFF60000L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x1040000000000002L,0x1400000000000000L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x1000000000000002L,0x0400000000000000L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000002L,0x0400000000000000L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x05FFFFFFFFFE0330L,0x03D3FFEC00191680L,0x0000000000000061L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0A80000000000000L,0x8000000000000000L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0800000000000000L,0x2000000000000000L});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0100000000000002L,0x4020000000000000L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x4000000000000002L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x4000000000000002L,0x0020000000000000L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x4020000000000000L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0100000000000002L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000014L});
        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0800000000000000L,0x4000000000000000L});
        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x4140000000000000L});
        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000000010L,0x0000000000100000L});
        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000010L,0x0000000000500000L,0x0000000000000200L});
        public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L,0x0000000000000180L});
        public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
        public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0800000000000002L,0x1000000000000000L});
        public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000040000002L});
        public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000400L});
    }


}