package org.eclipse.ocl.xtext.oclinecore.ui.contentassist.antlr.internal;

import java.io.InputStream;
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.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
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, 2021 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
@SuppressWarnings("all")
public class InternalOCLinEcoreParser extends AbstractInternalContentAssistParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_INT", "RULE_SINGLE_QUOTED_STRING", "RULE_ML_SINGLE_QUOTED_STRING", "RULE_SIMPLE_ID", "RULE_ESCAPED_ID", "RULE_UNQUOTED_STRING", "RULE_ESCAPED_CHARACTER", "RULE_LETTER_CHARACTER", "RULE_DOUBLE_QUOTED_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'abstract'", "'attribute'", "'body'", "'callable'", "'class'", "'composes'", "'datatype'", "'definition'", "'derivation'", "'derived'", "'enum'", "'extends'", "'id'", "'import'", "'initial'", "'interface'", "'key'", "'library'", "'module'", "'operation'", "'ordered'", "'package'", "'postcondition'", "'precondition'", "'primitive'", "'property'", "'readonly'", "'reference'", "'resolve'", "'static'", "'throws'", "'transient'", "'unique'", "'unsettable'", "'volatile'", "';'", "'!serializable'", "'annotation'", "'documentation'", "'invariant'", "'literal'", "'opposite'", "'serializable'", "'sysml'", "'-'", "'not'", "'not2'", "'*'", "'/'", "'+'", "'>'", "'<'", "'>='", "'<='", "'='", "'<>'", "'and'", "'and2'", "'implies'", "'implies2'", "'or'", "'or2'", "'xor'", "'xor2'", "'.'", "'->'", "'?.'", "'?->'", "'Map'", "'Tuple'", "'Boolean'", "'Integer'", "'Real'", "'String'", "'UnlimitedNatural'", "'OclAny'", "'OclInvalid'", "'OclVoid'", "'Set'", "'Bag'", "'Sequence'", "'Collection'", "'OrderedSet'", "'|?'", "'?'", "'('", "')'", "':'", "','", "'{'", "'}'", "'#'", "'::'", "'..'", "'++'", "'Lambda'", "'<-'", "'invalid'", "'null'", "'pre'", "'['", "']'", "'in'", "'if'", "'then'", "'else'", "'endif'", "'elseif'", "'let'", "'self'", "'&&'", "'!derived'", "'!id'", "'!ordered'", "'!readonly'", "'!transient'", "'!unique'", "'!unsettable'", "'!volatile'", "'::*'", "'!composes'", "'!resolve'", "'true'", "'false'", "'@'", "'|'", "'|1'"
    };
    public static final int T__143=143;
    public static final int T__50=50;
    public static final int T__140=140;
    public static final int T__142=142;
    public static final int T__141=141;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=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=8;
    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=9;
    public static final int RULE_SL_COMMENT=14;
    public static final int T__77=77;
    public static final int T__119=119;
    public static final int T__78=78;
    public static final int T__118=118;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__115=115;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__114=114;
    public static final int T__75=75;
    public static final int T__117=117;
    public static final int T__76=76;
    public static final int T__116=116;
    public static final int T__80=80;
    public static final int T__111=111;
    public static final int T__81=81;
    public static final int T__110=110;
    public static final int T__82=82;
    public static final int T__113=113;
    public static final int RULE_SIMPLE_ID=7;
    public static final int T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=15;
    public static final int RULE_ANY_OTHER=16;
    public static final int T__88=88;
    public static final int T__108=108;
    public static final int T__89=89;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__84=84;
    public static final int T__104=104;
    public static final int T__85=85;
    public static final int T__103=103;
    public static final int T__86=86;
    public static final int T__106=106;
    public static final int T__87=87;
    public static final int T__105=105;

    // delegates
    // delegators


        public 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"; }



     	private OCLinEcoreGrammarAccess grammarAccess;

        public void setGrammarAccess(OCLinEcoreGrammarAccess grammarAccess) {
        	this.grammarAccess = grammarAccess;
        }

        @Override
        protected Grammar getGrammar() {
        	return grammarAccess.getGrammar();
        }

        @Override
        protected String getValueForTokenName(String tokenName) {
        	return tokenName;
        }




    // $ANTLR start "entryRuleTopLevelCS"
    // InternalOCLinEcore.g:68:1: entryRuleTopLevelCS : ruleTopLevelCS EOF ;
    public final void entryRuleTopLevelCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:69:1: ( ruleTopLevelCS EOF )
            // InternalOCLinEcore.g:70:1: ruleTopLevelCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTopLevelCS();

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

            }

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


    // $ANTLR start "ruleTopLevelCS"
    // InternalOCLinEcore.g:77:1: ruleTopLevelCS : ( ( rule__TopLevelCS__Group__0 ) ) ;
    public final void ruleTopLevelCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:81:2: ( ( ( rule__TopLevelCS__Group__0 ) ) )
            // InternalOCLinEcore.g:82:1: ( ( rule__TopLevelCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:82:1: ( ( rule__TopLevelCS__Group__0 ) )
            // InternalOCLinEcore.g:83:1: ( rule__TopLevelCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:84:1: ( rule__TopLevelCS__Group__0 )
            // InternalOCLinEcore.g:84:2: rule__TopLevelCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTopLevelCS"


    // $ANTLR start "entryRuleSIGNED"
    // InternalOCLinEcore.g:98:1: entryRuleSIGNED : ruleSIGNED EOF ;
    public final void entryRuleSIGNED() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:99:1: ( ruleSIGNED EOF )
            // InternalOCLinEcore.g:100:1: ruleSIGNED EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSIGNEDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleSIGNED();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleSIGNED"


    // $ANTLR start "ruleSIGNED"
    // InternalOCLinEcore.g:107:1: ruleSIGNED : ( ( rule__SIGNED__Group__0 ) ) ;
    public final void ruleSIGNED() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:111:2: ( ( ( rule__SIGNED__Group__0 ) ) )
            // InternalOCLinEcore.g:112:1: ( ( rule__SIGNED__Group__0 ) )
            {
            // InternalOCLinEcore.g:112:1: ( ( rule__SIGNED__Group__0 ) )
            // InternalOCLinEcore.g:113:1: ( rule__SIGNED__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSIGNEDAccess().getGroup());
            }
            // InternalOCLinEcore.g:114:1: ( rule__SIGNED__Group__0 )
            // InternalOCLinEcore.g:114:2: rule__SIGNED__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SIGNED__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSIGNEDAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleSIGNED"


    // $ANTLR start "entryRuleEnumerationLiteralName"
    // InternalOCLinEcore.g:126:1: entryRuleEnumerationLiteralName : ruleEnumerationLiteralName EOF ;
    public final void entryRuleEnumerationLiteralName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:127:1: ( ruleEnumerationLiteralName EOF )
            // InternalOCLinEcore.g:128:1: ruleEnumerationLiteralName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEnumerationLiteralName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEnumerationLiteralName"


    // $ANTLR start "ruleEnumerationLiteralName"
    // InternalOCLinEcore.g:135:1: ruleEnumerationLiteralName : ( ( rule__EnumerationLiteralName__Alternatives ) ) ;
    public final void ruleEnumerationLiteralName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:139:2: ( ( ( rule__EnumerationLiteralName__Alternatives ) ) )
            // InternalOCLinEcore.g:140:1: ( ( rule__EnumerationLiteralName__Alternatives ) )
            {
            // InternalOCLinEcore.g:140:1: ( ( rule__EnumerationLiteralName__Alternatives ) )
            // InternalOCLinEcore.g:141:1: ( rule__EnumerationLiteralName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:142:1: ( rule__EnumerationLiteralName__Alternatives )
            // InternalOCLinEcore.g:142:2: rule__EnumerationLiteralName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEnumerationLiteralName"


    // $ANTLR start "entryRuleInvariantConstraintCS"
    // InternalOCLinEcore.g:154:1: entryRuleInvariantConstraintCS : ruleInvariantConstraintCS EOF ;
    public final void entryRuleInvariantConstraintCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:155:1: ( ruleInvariantConstraintCS EOF )
            // InternalOCLinEcore.g:156:1: ruleInvariantConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleInvariantConstraintCS();

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

            }

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


    // $ANTLR start "ruleInvariantConstraintCS"
    // InternalOCLinEcore.g:163:1: ruleInvariantConstraintCS : ( ( rule__InvariantConstraintCS__Group__0 ) ) ;
    public final void ruleInvariantConstraintCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:167:2: ( ( ( rule__InvariantConstraintCS__Group__0 ) ) )
            // InternalOCLinEcore.g:168:1: ( ( rule__InvariantConstraintCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:168:1: ( ( rule__InvariantConstraintCS__Group__0 ) )
            // InternalOCLinEcore.g:169:1: ( rule__InvariantConstraintCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:170:1: ( rule__InvariantConstraintCS__Group__0 )
            // InternalOCLinEcore.g:170:2: rule__InvariantConstraintCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleInvariantConstraintCS"


    // $ANTLR start "entryRulePostconditionConstraintCS"
    // InternalOCLinEcore.g:182:1: entryRulePostconditionConstraintCS : rulePostconditionConstraintCS EOF ;
    public final void entryRulePostconditionConstraintCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:183:1: ( rulePostconditionConstraintCS EOF )
            // InternalOCLinEcore.g:184:1: rulePostconditionConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePostconditionConstraintCS();

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

            }

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


    // $ANTLR start "rulePostconditionConstraintCS"
    // InternalOCLinEcore.g:191:1: rulePostconditionConstraintCS : ( ( rule__PostconditionConstraintCS__Group__0 ) ) ;
    public final void rulePostconditionConstraintCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:195:2: ( ( ( rule__PostconditionConstraintCS__Group__0 ) ) )
            // InternalOCLinEcore.g:196:1: ( ( rule__PostconditionConstraintCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:196:1: ( ( rule__PostconditionConstraintCS__Group__0 ) )
            // InternalOCLinEcore.g:197:1: ( rule__PostconditionConstraintCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:198:1: ( rule__PostconditionConstraintCS__Group__0 )
            // InternalOCLinEcore.g:198:2: rule__PostconditionConstraintCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePostconditionConstraintCS"


    // $ANTLR start "entryRulePreconditionConstraintCS"
    // InternalOCLinEcore.g:210:1: entryRulePreconditionConstraintCS : rulePreconditionConstraintCS EOF ;
    public final void entryRulePreconditionConstraintCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:211:1: ( rulePreconditionConstraintCS EOF )
            // InternalOCLinEcore.g:212:1: rulePreconditionConstraintCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePreconditionConstraintCS();

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

            }

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


    // $ANTLR start "rulePreconditionConstraintCS"
    // InternalOCLinEcore.g:219:1: rulePreconditionConstraintCS : ( ( rule__PreconditionConstraintCS__Group__0 ) ) ;
    public final void rulePreconditionConstraintCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:223:2: ( ( ( rule__PreconditionConstraintCS__Group__0 ) ) )
            // InternalOCLinEcore.g:224:1: ( ( rule__PreconditionConstraintCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:224:1: ( ( rule__PreconditionConstraintCS__Group__0 ) )
            // InternalOCLinEcore.g:225:1: ( rule__PreconditionConstraintCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:226:1: ( rule__PreconditionConstraintCS__Group__0 )
            // InternalOCLinEcore.g:226:2: rule__PreconditionConstraintCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePreconditionConstraintCS"


    // $ANTLR start "entryRuleAnnotationCS"
    // InternalOCLinEcore.g:238:1: entryRuleAnnotationCS : ruleAnnotationCS EOF ;
    public final void entryRuleAnnotationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:239:1: ( ruleAnnotationCS EOF )
            // InternalOCLinEcore.g:240:1: ruleAnnotationCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleAnnotationCS();

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

            }

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


    // $ANTLR start "ruleAnnotationCS"
    // InternalOCLinEcore.g:247:1: ruleAnnotationCS : ( ( rule__AnnotationCS__Group__0 ) ) ;
    public final void ruleAnnotationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:251:2: ( ( ( rule__AnnotationCS__Group__0 ) ) )
            // InternalOCLinEcore.g:252:1: ( ( rule__AnnotationCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:252:1: ( ( rule__AnnotationCS__Group__0 ) )
            // InternalOCLinEcore.g:253:1: ( rule__AnnotationCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:254:1: ( rule__AnnotationCS__Group__0 )
            // InternalOCLinEcore.g:254:2: rule__AnnotationCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleAnnotationCS"


    // $ANTLR start "entryRuleAnnotationElementCS"
    // InternalOCLinEcore.g:266:1: entryRuleAnnotationElementCS : ruleAnnotationElementCS EOF ;
    public final void entryRuleAnnotationElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:267:1: ( ruleAnnotationElementCS EOF )
            // InternalOCLinEcore.g:268:1: ruleAnnotationElementCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleAnnotationElementCS();

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

            }

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


    // $ANTLR start "ruleAnnotationElementCS"
    // InternalOCLinEcore.g:275:1: ruleAnnotationElementCS : ( ( rule__AnnotationElementCS__Alternatives ) ) ;
    public final void ruleAnnotationElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:279:2: ( ( ( rule__AnnotationElementCS__Alternatives ) ) )
            // InternalOCLinEcore.g:280:1: ( ( rule__AnnotationElementCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:280:1: ( ( rule__AnnotationElementCS__Alternatives ) )
            // InternalOCLinEcore.g:281:1: ( rule__AnnotationElementCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationElementCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:282:1: ( rule__AnnotationElementCS__Alternatives )
            // InternalOCLinEcore.g:282:2: rule__AnnotationElementCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationElementCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationElementCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleAnnotationElementCS"


    // $ANTLR start "entryRuleAttributeCS"
    // InternalOCLinEcore.g:294:1: entryRuleAttributeCS : ruleAttributeCS EOF ;
    public final void entryRuleAttributeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:295:1: ( ruleAttributeCS EOF )
            // InternalOCLinEcore.g:296:1: ruleAttributeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleAttributeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleAttributeCS"


    // $ANTLR start "ruleAttributeCS"
    // InternalOCLinEcore.g:303:1: ruleAttributeCS : ( ( rule__AttributeCS__Group__0 ) ) ;
    public final void ruleAttributeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:307:2: ( ( ( rule__AttributeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:308:1: ( ( rule__AttributeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:308:1: ( ( rule__AttributeCS__Group__0 ) )
            // InternalOCLinEcore.g:309:1: ( rule__AttributeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:310:1: ( rule__AttributeCS__Group__0 )
            // InternalOCLinEcore.g:310:2: rule__AttributeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleAttributeCS"


    // $ANTLR start "entryRuleClassCS"
    // InternalOCLinEcore.g:322:1: entryRuleClassCS : ruleClassCS EOF ;
    public final void entryRuleClassCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:323:1: ( ruleClassCS EOF )
            // InternalOCLinEcore.g:324:1: ruleClassCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleClassCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleClassCS"


    // $ANTLR start "ruleClassCS"
    // InternalOCLinEcore.g:331:1: ruleClassCS : ( ( rule__ClassCS__Alternatives ) ) ;
    public final void ruleClassCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:335:2: ( ( ( rule__ClassCS__Alternatives ) ) )
            // InternalOCLinEcore.g:336:1: ( ( rule__ClassCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:336:1: ( ( rule__ClassCS__Alternatives ) )
            // InternalOCLinEcore.g:337:1: ( rule__ClassCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getClassCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:338:1: ( rule__ClassCS__Alternatives )
            // InternalOCLinEcore.g:338:2: rule__ClassCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ClassCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getClassCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleClassCS"


    // $ANTLR start "entryRuleDataTypeCS"
    // InternalOCLinEcore.g:350:1: entryRuleDataTypeCS : ruleDataTypeCS EOF ;
    public final void entryRuleDataTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:351:1: ( ruleDataTypeCS EOF )
            // InternalOCLinEcore.g:352:1: ruleDataTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleDataTypeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleDataTypeCS"


    // $ANTLR start "ruleDataTypeCS"
    // InternalOCLinEcore.g:359:1: ruleDataTypeCS : ( ( rule__DataTypeCS__Group__0 ) ) ;
    public final void ruleDataTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:363:2: ( ( ( rule__DataTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:364:1: ( ( rule__DataTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:364:1: ( ( rule__DataTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:365:1: ( rule__DataTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:366:1: ( rule__DataTypeCS__Group__0 )
            // InternalOCLinEcore.g:366:2: rule__DataTypeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleDataTypeCS"


    // $ANTLR start "entryRuleDetailCS"
    // InternalOCLinEcore.g:378:1: entryRuleDetailCS : ruleDetailCS EOF ;
    public final void entryRuleDetailCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:379:1: ( ruleDetailCS EOF )
            // InternalOCLinEcore.g:380:1: ruleDetailCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleDetailCS();

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

            }

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


    // $ANTLR start "ruleDetailCS"
    // InternalOCLinEcore.g:387:1: ruleDetailCS : ( ( rule__DetailCS__Group__0 ) ) ;
    public final void ruleDetailCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:391:2: ( ( ( rule__DetailCS__Group__0 ) ) )
            // InternalOCLinEcore.g:392:1: ( ( rule__DetailCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:392:1: ( ( rule__DetailCS__Group__0 ) )
            // InternalOCLinEcore.g:393:1: ( rule__DetailCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:394:1: ( rule__DetailCS__Group__0 )
            // InternalOCLinEcore.g:394:2: rule__DetailCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleDetailCS"


    // $ANTLR start "entryRuleDocumentationCS"
    // InternalOCLinEcore.g:406:1: entryRuleDocumentationCS : ruleDocumentationCS EOF ;
    public final void entryRuleDocumentationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:407:1: ( ruleDocumentationCS EOF )
            // InternalOCLinEcore.g:408:1: ruleDocumentationCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleDocumentationCS();

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

            }

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


    // $ANTLR start "ruleDocumentationCS"
    // InternalOCLinEcore.g:415:1: ruleDocumentationCS : ( ( rule__DocumentationCS__Group__0 ) ) ;
    public final void ruleDocumentationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:419:2: ( ( ( rule__DocumentationCS__Group__0 ) ) )
            // InternalOCLinEcore.g:420:1: ( ( rule__DocumentationCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:420:1: ( ( rule__DocumentationCS__Group__0 ) )
            // InternalOCLinEcore.g:421:1: ( rule__DocumentationCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:422:1: ( rule__DocumentationCS__Group__0 )
            // InternalOCLinEcore.g:422:2: rule__DocumentationCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleDocumentationCS"


    // $ANTLR start "entryRuleEnumerationCS"
    // InternalOCLinEcore.g:434:1: entryRuleEnumerationCS : ruleEnumerationCS EOF ;
    public final void entryRuleEnumerationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:435:1: ( ruleEnumerationCS EOF )
            // InternalOCLinEcore.g:436:1: ruleEnumerationCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEnumerationCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEnumerationCS"


    // $ANTLR start "ruleEnumerationCS"
    // InternalOCLinEcore.g:443:1: ruleEnumerationCS : ( ( rule__EnumerationCS__Group__0 ) ) ;
    public final void ruleEnumerationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:447:2: ( ( ( rule__EnumerationCS__Group__0 ) ) )
            // InternalOCLinEcore.g:448:1: ( ( rule__EnumerationCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:448:1: ( ( rule__EnumerationCS__Group__0 ) )
            // InternalOCLinEcore.g:449:1: ( rule__EnumerationCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:450:1: ( rule__EnumerationCS__Group__0 )
            // InternalOCLinEcore.g:450:2: rule__EnumerationCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEnumerationCS"


    // $ANTLR start "entryRuleEnumerationLiteralCS"
    // InternalOCLinEcore.g:462:1: entryRuleEnumerationLiteralCS : ruleEnumerationLiteralCS EOF ;
    public final void entryRuleEnumerationLiteralCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:463:1: ( ruleEnumerationLiteralCS EOF )
            // InternalOCLinEcore.g:464:1: ruleEnumerationLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEnumerationLiteralCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEnumerationLiteralCS"


    // $ANTLR start "ruleEnumerationLiteralCS"
    // InternalOCLinEcore.g:471:1: ruleEnumerationLiteralCS : ( ( rule__EnumerationLiteralCS__Group__0 ) ) ;
    public final void ruleEnumerationLiteralCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:475:2: ( ( ( rule__EnumerationLiteralCS__Group__0 ) ) )
            // InternalOCLinEcore.g:476:1: ( ( rule__EnumerationLiteralCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:476:1: ( ( rule__EnumerationLiteralCS__Group__0 ) )
            // InternalOCLinEcore.g:477:1: ( rule__EnumerationLiteralCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:478:1: ( rule__EnumerationLiteralCS__Group__0 )
            // InternalOCLinEcore.g:478:2: rule__EnumerationLiteralCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEnumerationLiteralCS"


    // $ANTLR start "entryRuleImportCS"
    // InternalOCLinEcore.g:490:1: entryRuleImportCS : ruleImportCS EOF ;
    public final void entryRuleImportCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:491:1: ( ruleImportCS EOF )
            // InternalOCLinEcore.g:492:1: ruleImportCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleImportCS();

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

            }

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


    // $ANTLR start "ruleImportCS"
    // InternalOCLinEcore.g:499:1: ruleImportCS : ( ( rule__ImportCS__Group__0 ) ) ;
    public final void ruleImportCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:503:2: ( ( ( rule__ImportCS__Group__0 ) ) )
            // InternalOCLinEcore.g:504:1: ( ( rule__ImportCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:504:1: ( ( rule__ImportCS__Group__0 ) )
            // InternalOCLinEcore.g:505:1: ( rule__ImportCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:506:1: ( rule__ImportCS__Group__0 )
            // InternalOCLinEcore.g:506:2: rule__ImportCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleImportCS"


    // $ANTLR start "entryRuleModelElementCS"
    // InternalOCLinEcore.g:518:1: entryRuleModelElementCS : ruleModelElementCS EOF ;
    public final void entryRuleModelElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:519:1: ( ruleModelElementCS EOF )
            // InternalOCLinEcore.g:520:1: ruleModelElementCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleModelElementCS();

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

            }

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


    // $ANTLR start "ruleModelElementCS"
    // InternalOCLinEcore.g:527:1: ruleModelElementCS : ( ( rule__ModelElementCS__Alternatives ) ) ;
    public final void ruleModelElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:531:2: ( ( ( rule__ModelElementCS__Alternatives ) ) )
            // InternalOCLinEcore.g:532:1: ( ( rule__ModelElementCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:532:1: ( ( rule__ModelElementCS__Alternatives ) )
            // InternalOCLinEcore.g:533:1: ( rule__ModelElementCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:534:1: ( rule__ModelElementCS__Alternatives )
            // InternalOCLinEcore.g:534:2: rule__ModelElementCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleModelElementCS"


    // $ANTLR start "entryRuleModelElementRefCS"
    // InternalOCLinEcore.g:546:1: entryRuleModelElementRefCS : ruleModelElementRefCS EOF ;
    public final void entryRuleModelElementRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:547:1: ( ruleModelElementRefCS EOF )
            // InternalOCLinEcore.g:548:1: ruleModelElementRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleModelElementRefCS();

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

            }

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


    // $ANTLR start "ruleModelElementRefCS"
    // InternalOCLinEcore.g:555:1: ruleModelElementRefCS : ( ( rule__ModelElementRefCS__Group__0 ) ) ;
    public final void ruleModelElementRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:559:2: ( ( ( rule__ModelElementRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:560:1: ( ( rule__ModelElementRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:560:1: ( ( rule__ModelElementRefCS__Group__0 ) )
            // InternalOCLinEcore.g:561:1: ( rule__ModelElementRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:562:1: ( rule__ModelElementRefCS__Group__0 )
            // InternalOCLinEcore.g:562:2: rule__ModelElementRefCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementRefCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementRefCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleModelElementRefCS"


    // $ANTLR start "entryRuleOperationCS"
    // InternalOCLinEcore.g:574:1: entryRuleOperationCS : ruleOperationCS EOF ;
    public final void entryRuleOperationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:575:1: ( ruleOperationCS EOF )
            // InternalOCLinEcore.g:576:1: ruleOperationCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleOperationCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOperationCS"


    // $ANTLR start "ruleOperationCS"
    // InternalOCLinEcore.g:583:1: ruleOperationCS : ( ( rule__OperationCS__Group__0 ) ) ;
    public final void ruleOperationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:587:2: ( ( ( rule__OperationCS__Group__0 ) ) )
            // InternalOCLinEcore.g:588:1: ( ( rule__OperationCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:588:1: ( ( rule__OperationCS__Group__0 ) )
            // InternalOCLinEcore.g:589:1: ( rule__OperationCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:590:1: ( rule__OperationCS__Group__0 )
            // InternalOCLinEcore.g:590:2: rule__OperationCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOperationCS"


    // $ANTLR start "entryRulePackageCS"
    // InternalOCLinEcore.g:602:1: entryRulePackageCS : rulePackageCS EOF ;
    public final void entryRulePackageCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:603:1: ( rulePackageCS EOF )
            // InternalOCLinEcore.g:604:1: rulePackageCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePackageCS();

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

            }

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


    // $ANTLR start "rulePackageCS"
    // InternalOCLinEcore.g:611:1: rulePackageCS : ( ( rule__PackageCS__Group__0 ) ) ;
    public final void rulePackageCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:615:2: ( ( ( rule__PackageCS__Group__0 ) ) )
            // InternalOCLinEcore.g:616:1: ( ( rule__PackageCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:616:1: ( ( rule__PackageCS__Group__0 ) )
            // InternalOCLinEcore.g:617:1: ( rule__PackageCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:618:1: ( rule__PackageCS__Group__0 )
            // InternalOCLinEcore.g:618:2: rule__PackageCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePackageCS"


    // $ANTLR start "entryRuleParameterCS"
    // InternalOCLinEcore.g:630:1: entryRuleParameterCS : ruleParameterCS EOF ;
    public final void entryRuleParameterCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:631:1: ( ruleParameterCS EOF )
            // InternalOCLinEcore.g:632:1: ruleParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleParameterCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleParameterCS"


    // $ANTLR start "ruleParameterCS"
    // InternalOCLinEcore.g:639:1: ruleParameterCS : ( ( rule__ParameterCS__Group__0 ) ) ;
    public final void ruleParameterCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:643:2: ( ( ( rule__ParameterCS__Group__0 ) ) )
            // InternalOCLinEcore.g:644:1: ( ( rule__ParameterCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:644:1: ( ( rule__ParameterCS__Group__0 ) )
            // InternalOCLinEcore.g:645:1: ( rule__ParameterCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:646:1: ( rule__ParameterCS__Group__0 )
            // InternalOCLinEcore.g:646:2: rule__ParameterCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleParameterCS"


    // $ANTLR start "entryRuleImplicitOppositeCS"
    // InternalOCLinEcore.g:658:1: entryRuleImplicitOppositeCS : ruleImplicitOppositeCS EOF ;
    public final void entryRuleImplicitOppositeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:659:1: ( ruleImplicitOppositeCS EOF )
            // InternalOCLinEcore.g:660:1: ruleImplicitOppositeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleImplicitOppositeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleImplicitOppositeCS"


    // $ANTLR start "ruleImplicitOppositeCS"
    // InternalOCLinEcore.g:667:1: ruleImplicitOppositeCS : ( ( rule__ImplicitOppositeCS__Group__0 ) ) ;
    public final void ruleImplicitOppositeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:671:2: ( ( ( rule__ImplicitOppositeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:672:1: ( ( rule__ImplicitOppositeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:672:1: ( ( rule__ImplicitOppositeCS__Group__0 ) )
            // InternalOCLinEcore.g:673:1: ( rule__ImplicitOppositeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:674:1: ( rule__ImplicitOppositeCS__Group__0 )
            // InternalOCLinEcore.g:674:2: rule__ImplicitOppositeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleImplicitOppositeCS"


    // $ANTLR start "entryRuleReferenceCS"
    // InternalOCLinEcore.g:686:1: entryRuleReferenceCS : ruleReferenceCS EOF ;
    public final void entryRuleReferenceCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:687:1: ( ruleReferenceCS EOF )
            // InternalOCLinEcore.g:688:1: ruleReferenceCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleReferenceCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleReferenceCS"


    // $ANTLR start "ruleReferenceCS"
    // InternalOCLinEcore.g:695:1: ruleReferenceCS : ( ( rule__ReferenceCS__Group__0 ) ) ;
    public final void ruleReferenceCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:699:2: ( ( ( rule__ReferenceCS__Group__0 ) ) )
            // InternalOCLinEcore.g:700:1: ( ( rule__ReferenceCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:700:1: ( ( rule__ReferenceCS__Group__0 ) )
            // InternalOCLinEcore.g:701:1: ( rule__ReferenceCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:702:1: ( rule__ReferenceCS__Group__0 )
            // InternalOCLinEcore.g:702:2: rule__ReferenceCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleReferenceCS"


    // $ANTLR start "entryRuleSpecificationCS"
    // InternalOCLinEcore.g:714:1: entryRuleSpecificationCS : ruleSpecificationCS EOF ;
    public final void entryRuleSpecificationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:715:1: ( ruleSpecificationCS EOF )
            // InternalOCLinEcore.g:716:1: ruleSpecificationCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSpecificationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleSpecificationCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleSpecificationCS"


    // $ANTLR start "ruleSpecificationCS"
    // InternalOCLinEcore.g:723:1: ruleSpecificationCS : ( ( rule__SpecificationCS__Alternatives ) ) ;
    public final void ruleSpecificationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:727:2: ( ( ( rule__SpecificationCS__Alternatives ) ) )
            // InternalOCLinEcore.g:728:1: ( ( rule__SpecificationCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:728:1: ( ( rule__SpecificationCS__Alternatives ) )
            // InternalOCLinEcore.g:729:1: ( rule__SpecificationCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSpecificationCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:730:1: ( rule__SpecificationCS__Alternatives )
            // InternalOCLinEcore.g:730:2: rule__SpecificationCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SpecificationCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSpecificationCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleSpecificationCS"


    // $ANTLR start "entryRuleStructuredClassCS"
    // InternalOCLinEcore.g:742:1: entryRuleStructuredClassCS : ruleStructuredClassCS EOF ;
    public final void entryRuleStructuredClassCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:743:1: ( ruleStructuredClassCS EOF )
            // InternalOCLinEcore.g:744:1: ruleStructuredClassCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleStructuredClassCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStructuredClassCS"


    // $ANTLR start "ruleStructuredClassCS"
    // InternalOCLinEcore.g:751:1: ruleStructuredClassCS : ( ( rule__StructuredClassCS__Group__0 ) ) ;
    public final void ruleStructuredClassCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:755:2: ( ( ( rule__StructuredClassCS__Group__0 ) ) )
            // InternalOCLinEcore.g:756:1: ( ( rule__StructuredClassCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:756:1: ( ( rule__StructuredClassCS__Group__0 ) )
            // InternalOCLinEcore.g:757:1: ( rule__StructuredClassCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:758:1: ( rule__StructuredClassCS__Group__0 )
            // InternalOCLinEcore.g:758:2: rule__StructuredClassCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStructuredClassCS"


    // $ANTLR start "entryRuleStructuralFeatureCS"
    // InternalOCLinEcore.g:770:1: entryRuleStructuralFeatureCS : ruleStructuralFeatureCS EOF ;
    public final void entryRuleStructuralFeatureCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:771:1: ( ruleStructuralFeatureCS EOF )
            // InternalOCLinEcore.g:772:1: ruleStructuralFeatureCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuralFeatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleStructuralFeatureCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStructuralFeatureCS"


    // $ANTLR start "ruleStructuralFeatureCS"
    // InternalOCLinEcore.g:779:1: ruleStructuralFeatureCS : ( ( rule__StructuralFeatureCS__Alternatives ) ) ;
    public final void ruleStructuralFeatureCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:783:2: ( ( ( rule__StructuralFeatureCS__Alternatives ) ) )
            // InternalOCLinEcore.g:784:1: ( ( rule__StructuralFeatureCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:784:1: ( ( rule__StructuralFeatureCS__Alternatives ) )
            // InternalOCLinEcore.g:785:1: ( rule__StructuralFeatureCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuralFeatureCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:786:1: ( rule__StructuralFeatureCS__Alternatives )
            // InternalOCLinEcore.g:786:2: rule__StructuralFeatureCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuralFeatureCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuralFeatureCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStructuralFeatureCS"


    // $ANTLR start "entryRuleSysMLCS"
    // InternalOCLinEcore.g:798:1: entryRuleSysMLCS : ruleSysMLCS EOF ;
    public final void entryRuleSysMLCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:799:1: ( ruleSysMLCS EOF )
            // InternalOCLinEcore.g:800:1: ruleSysMLCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleSysMLCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleSysMLCS"


    // $ANTLR start "ruleSysMLCS"
    // InternalOCLinEcore.g:807:1: ruleSysMLCS : ( ( rule__SysMLCS__Group__0 ) ) ;
    public final void ruleSysMLCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:811:2: ( ( ( rule__SysMLCS__Group__0 ) ) )
            // InternalOCLinEcore.g:812:1: ( ( rule__SysMLCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:812:1: ( ( rule__SysMLCS__Group__0 ) )
            // InternalOCLinEcore.g:813:1: ( rule__SysMLCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:814:1: ( rule__SysMLCS__Group__0 )
            // InternalOCLinEcore.g:814:2: rule__SysMLCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleSysMLCS"


    // $ANTLR start "entryRuleTypedMultiplicityRefCS"
    // InternalOCLinEcore.g:828:1: entryRuleTypedMultiplicityRefCS : ruleTypedMultiplicityRefCS EOF ;
    public final void entryRuleTypedMultiplicityRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:829:1: ( ruleTypedMultiplicityRefCS EOF )
            // InternalOCLinEcore.g:830:1: ruleTypedMultiplicityRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypedMultiplicityRefCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypedMultiplicityRefCS"


    // $ANTLR start "ruleTypedMultiplicityRefCS"
    // InternalOCLinEcore.g:837:1: ruleTypedMultiplicityRefCS : ( ( rule__TypedMultiplicityRefCS__Group__0 ) ) ;
    public final void ruleTypedMultiplicityRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:841:2: ( ( ( rule__TypedMultiplicityRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:842:1: ( ( rule__TypedMultiplicityRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:842:1: ( ( rule__TypedMultiplicityRefCS__Group__0 ) )
            // InternalOCLinEcore.g:843:1: ( rule__TypedMultiplicityRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:844:1: ( rule__TypedMultiplicityRefCS__Group__0 )
            // InternalOCLinEcore.g:844:2: rule__TypedMultiplicityRefCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedMultiplicityRefCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedMultiplicityRefCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypedMultiplicityRefCS"


    // $ANTLR start "entryRuleTemplateSignatureCS"
    // InternalOCLinEcore.g:856:1: entryRuleTemplateSignatureCS : ruleTemplateSignatureCS EOF ;
    public final void entryRuleTemplateSignatureCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:857:1: ( ruleTemplateSignatureCS EOF )
            // InternalOCLinEcore.g:858:1: ruleTemplateSignatureCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTemplateSignatureCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTemplateSignatureCS"


    // $ANTLR start "ruleTemplateSignatureCS"
    // InternalOCLinEcore.g:865:1: ruleTemplateSignatureCS : ( ( rule__TemplateSignatureCS__Alternatives ) ) ;
    public final void ruleTemplateSignatureCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:869:2: ( ( ( rule__TemplateSignatureCS__Alternatives ) ) )
            // InternalOCLinEcore.g:870:1: ( ( rule__TemplateSignatureCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:870:1: ( ( rule__TemplateSignatureCS__Alternatives ) )
            // InternalOCLinEcore.g:871:1: ( rule__TemplateSignatureCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:872:1: ( rule__TemplateSignatureCS__Alternatives )
            // InternalOCLinEcore.g:872:2: rule__TemplateSignatureCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTemplateSignatureCS"


    // $ANTLR start "entryRuleTypedRefCS"
    // InternalOCLinEcore.g:884:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
    public final void entryRuleTypedRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:885:1: ( ruleTypedRefCS EOF )
            // InternalOCLinEcore.g:886:1: ruleTypedRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypedRefCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypedRefCS"


    // $ANTLR start "ruleTypedRefCS"
    // InternalOCLinEcore.g:893:1: ruleTypedRefCS : ( ( rule__TypedRefCS__Alternatives ) ) ;
    public final void ruleTypedRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:897:2: ( ( ( rule__TypedRefCS__Alternatives ) ) )
            // InternalOCLinEcore.g:898:1: ( ( rule__TypedRefCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:898:1: ( ( rule__TypedRefCS__Alternatives ) )
            // InternalOCLinEcore.g:899:1: ( rule__TypedRefCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedRefCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:900:1: ( rule__TypedRefCS__Alternatives )
            // InternalOCLinEcore.g:900:2: rule__TypedRefCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedRefCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedRefCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypedRefCS"


    // $ANTLR start "entryRuleTypedTypeRefCS"
    // InternalOCLinEcore.g:912:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
    public final void entryRuleTypedTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:913:1: ( ruleTypedTypeRefCS EOF )
            // InternalOCLinEcore.g:914:1: ruleTypedTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypedTypeRefCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypedTypeRefCS"


    // $ANTLR start "ruleTypedTypeRefCS"
    // InternalOCLinEcore.g:921:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
    public final void ruleTypedTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:925:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:926:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:926:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
            // InternalOCLinEcore.g:927:1: ( rule__TypedTypeRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:928:1: ( rule__TypedTypeRefCS__Group__0 )
            // InternalOCLinEcore.g:928:2: rule__TypedTypeRefCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypedTypeRefCS"


    // $ANTLR start "entryRuleUnrestrictedName"
    // InternalOCLinEcore.g:940:1: entryRuleUnrestrictedName : ruleUnrestrictedName EOF ;
    public final void entryRuleUnrestrictedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:941:1: ( ruleUnrestrictedName EOF )
            // InternalOCLinEcore.g:942:1: ruleUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleUnrestrictedName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleUnrestrictedName"


    // $ANTLR start "ruleUnrestrictedName"
    // InternalOCLinEcore.g:949:1: ruleUnrestrictedName : ( ( rule__UnrestrictedName__Alternatives ) ) ;
    public final void ruleUnrestrictedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:953:2: ( ( ( rule__UnrestrictedName__Alternatives ) ) )
            // InternalOCLinEcore.g:954:1: ( ( rule__UnrestrictedName__Alternatives ) )
            {
            // InternalOCLinEcore.g:954:1: ( ( rule__UnrestrictedName__Alternatives ) )
            // InternalOCLinEcore.g:955:1: ( rule__UnrestrictedName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnrestrictedNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:956:1: ( rule__UnrestrictedName__Alternatives )
            // InternalOCLinEcore.g:956:2: rule__UnrestrictedName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__UnrestrictedName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnrestrictedNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleUnrestrictedName"


    // $ANTLR start "entryRuleEssentialOCLUnaryOperatorName"
    // InternalOCLinEcore.g:972:1: entryRuleEssentialOCLUnaryOperatorName : ruleEssentialOCLUnaryOperatorName EOF ;
    public final void entryRuleEssentialOCLUnaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:973:1: ( ruleEssentialOCLUnaryOperatorName EOF )
            // InternalOCLinEcore.g:974:1: ruleEssentialOCLUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEssentialOCLUnaryOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEssentialOCLUnaryOperatorName"


    // $ANTLR start "ruleEssentialOCLUnaryOperatorName"
    // InternalOCLinEcore.g:981:1: ruleEssentialOCLUnaryOperatorName : ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLUnaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:985:2: ( ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:986:1: ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:986:1: ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:987:1: ( rule__EssentialOCLUnaryOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:988:1: ( rule__EssentialOCLUnaryOperatorName__Alternatives )
            // InternalOCLinEcore.g:988:2: rule__EssentialOCLUnaryOperatorName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EssentialOCLUnaryOperatorName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEssentialOCLUnaryOperatorName"


    // $ANTLR start "entryRuleEssentialOCLInfixOperatorName"
    // InternalOCLinEcore.g:1000:1: entryRuleEssentialOCLInfixOperatorName : ruleEssentialOCLInfixOperatorName EOF ;
    public final void entryRuleEssentialOCLInfixOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1001:1: ( ruleEssentialOCLInfixOperatorName EOF )
            // InternalOCLinEcore.g:1002:1: ruleEssentialOCLInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEssentialOCLInfixOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEssentialOCLInfixOperatorName"


    // $ANTLR start "ruleEssentialOCLInfixOperatorName"
    // InternalOCLinEcore.g:1009:1: ruleEssentialOCLInfixOperatorName : ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLInfixOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1013:2: ( ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:1014:1: ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1014:1: ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:1015:1: ( rule__EssentialOCLInfixOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1016:1: ( rule__EssentialOCLInfixOperatorName__Alternatives )
            // InternalOCLinEcore.g:1016:2: rule__EssentialOCLInfixOperatorName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EssentialOCLInfixOperatorName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEssentialOCLInfixOperatorName"


    // $ANTLR start "entryRuleEssentialOCLNavigationOperatorName"
    // InternalOCLinEcore.g:1028:1: entryRuleEssentialOCLNavigationOperatorName : ruleEssentialOCLNavigationOperatorName EOF ;
    public final void entryRuleEssentialOCLNavigationOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1029:1: ( ruleEssentialOCLNavigationOperatorName EOF )
            // InternalOCLinEcore.g:1030:1: ruleEssentialOCLNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEssentialOCLNavigationOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEssentialOCLNavigationOperatorName"


    // $ANTLR start "ruleEssentialOCLNavigationOperatorName"
    // InternalOCLinEcore.g:1037:1: ruleEssentialOCLNavigationOperatorName : ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLNavigationOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1041:2: ( ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:1042:1: ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1042:1: ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:1043:1: ( rule__EssentialOCLNavigationOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1044:1: ( rule__EssentialOCLNavigationOperatorName__Alternatives )
            // InternalOCLinEcore.g:1044:2: rule__EssentialOCLNavigationOperatorName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EssentialOCLNavigationOperatorName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEssentialOCLNavigationOperatorName"


    // $ANTLR start "entryRuleBinaryOperatorName"
    // InternalOCLinEcore.g:1056:1: entryRuleBinaryOperatorName : ruleBinaryOperatorName EOF ;
    public final void entryRuleBinaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1057:1: ( ruleBinaryOperatorName EOF )
            // InternalOCLinEcore.g:1058:1: ruleBinaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBinaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleBinaryOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleBinaryOperatorName"


    // $ANTLR start "ruleBinaryOperatorName"
    // InternalOCLinEcore.g:1065:1: ruleBinaryOperatorName : ( ( rule__BinaryOperatorName__Alternatives ) ) ;
    public final void ruleBinaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1069:2: ( ( ( rule__BinaryOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:1070:1: ( ( rule__BinaryOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1070:1: ( ( rule__BinaryOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:1071:1: ( rule__BinaryOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBinaryOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1072:1: ( rule__BinaryOperatorName__Alternatives )
            // InternalOCLinEcore.g:1072:2: rule__BinaryOperatorName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__BinaryOperatorName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getBinaryOperatorNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleBinaryOperatorName"


    // $ANTLR start "entryRuleInfixOperatorName"
    // InternalOCLinEcore.g:1084:1: entryRuleInfixOperatorName : ruleInfixOperatorName EOF ;
    public final void entryRuleInfixOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1085:1: ( ruleInfixOperatorName EOF )
            // InternalOCLinEcore.g:1086:1: ruleInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleInfixOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleInfixOperatorName"


    // $ANTLR start "ruleInfixOperatorName"
    // InternalOCLinEcore.g:1093:1: ruleInfixOperatorName : ( ruleEssentialOCLInfixOperatorName ) ;
    public final void ruleInfixOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1097:2: ( ( ruleEssentialOCLInfixOperatorName ) )
            // InternalOCLinEcore.g:1098:1: ( ruleEssentialOCLInfixOperatorName )
            {
            // InternalOCLinEcore.g:1098:1: ( ruleEssentialOCLInfixOperatorName )
            // InternalOCLinEcore.g:1099:1: ruleEssentialOCLInfixOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInfixOperatorNameAccess().getEssentialOCLInfixOperatorNameParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEssentialOCLInfixOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInfixOperatorNameAccess().getEssentialOCLInfixOperatorNameParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleInfixOperatorName"


    // $ANTLR start "entryRuleNavigationOperatorName"
    // InternalOCLinEcore.g:1112:1: entryRuleNavigationOperatorName : ruleNavigationOperatorName EOF ;
    public final void entryRuleNavigationOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1113:1: ( ruleNavigationOperatorName EOF )
            // InternalOCLinEcore.g:1114:1: ruleNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigationOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigationOperatorName"


    // $ANTLR start "ruleNavigationOperatorName"
    // InternalOCLinEcore.g:1121:1: ruleNavigationOperatorName : ( ruleEssentialOCLNavigationOperatorName ) ;
    public final void ruleNavigationOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1125:2: ( ( ruleEssentialOCLNavigationOperatorName ) )
            // InternalOCLinEcore.g:1126:1: ( ruleEssentialOCLNavigationOperatorName )
            {
            // InternalOCLinEcore.g:1126:1: ( ruleEssentialOCLNavigationOperatorName )
            // InternalOCLinEcore.g:1127:1: ruleEssentialOCLNavigationOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigationOperatorNameAccess().getEssentialOCLNavigationOperatorNameParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEssentialOCLNavigationOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigationOperatorNameAccess().getEssentialOCLNavigationOperatorNameParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigationOperatorName"


    // $ANTLR start "entryRuleUnaryOperatorName"
    // InternalOCLinEcore.g:1140:1: entryRuleUnaryOperatorName : ruleUnaryOperatorName EOF ;
    public final void entryRuleUnaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1141:1: ( ruleUnaryOperatorName EOF )
            // InternalOCLinEcore.g:1142:1: ruleUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleUnaryOperatorName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleUnaryOperatorName"


    // $ANTLR start "ruleUnaryOperatorName"
    // InternalOCLinEcore.g:1149:1: ruleUnaryOperatorName : ( ruleEssentialOCLUnaryOperatorName ) ;
    public final void ruleUnaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1153:2: ( ( ruleEssentialOCLUnaryOperatorName ) )
            // InternalOCLinEcore.g:1154:1: ( ruleEssentialOCLUnaryOperatorName )
            {
            // InternalOCLinEcore.g:1154:1: ( ruleEssentialOCLUnaryOperatorName )
            // InternalOCLinEcore.g:1155:1: ruleEssentialOCLUnaryOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnaryOperatorNameAccess().getEssentialOCLUnaryOperatorNameParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEssentialOCLUnaryOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnaryOperatorNameAccess().getEssentialOCLUnaryOperatorNameParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleUnaryOperatorName"


    // $ANTLR start "entryRuleEssentialOCLUnrestrictedName"
    // InternalOCLinEcore.g:1168:1: entryRuleEssentialOCLUnrestrictedName : ruleEssentialOCLUnrestrictedName EOF ;
    public final void entryRuleEssentialOCLUnrestrictedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1169:1: ( ruleEssentialOCLUnrestrictedName EOF )
            // InternalOCLinEcore.g:1170:1: ruleEssentialOCLUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEssentialOCLUnrestrictedName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEssentialOCLUnrestrictedName"


    // $ANTLR start "ruleEssentialOCLUnrestrictedName"
    // InternalOCLinEcore.g:1177:1: ruleEssentialOCLUnrestrictedName : ( ruleIdentifier ) ;
    public final void ruleEssentialOCLUnrestrictedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1181:2: ( ( ruleIdentifier ) )
            // InternalOCLinEcore.g:1182:1: ( ruleIdentifier )
            {
            // InternalOCLinEcore.g:1182:1: ( ruleIdentifier )
            // InternalOCLinEcore.g:1183:1: ruleIdentifier
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnrestrictedNameAccess().getIdentifierParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleIdentifier();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEssentialOCLUnrestrictedNameAccess().getIdentifierParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEssentialOCLUnrestrictedName"


    // $ANTLR start "entryRuleEssentialOCLUnreservedName"
    // InternalOCLinEcore.g:1196:1: entryRuleEssentialOCLUnreservedName : ruleEssentialOCLUnreservedName EOF ;
    public final void entryRuleEssentialOCLUnreservedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1197:1: ( ruleEssentialOCLUnreservedName EOF )
            // InternalOCLinEcore.g:1198:1: ruleEssentialOCLUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleEssentialOCLUnreservedName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleEssentialOCLUnreservedName"


    // $ANTLR start "ruleEssentialOCLUnreservedName"
    // InternalOCLinEcore.g:1205:1: ruleEssentialOCLUnreservedName : ( ( rule__EssentialOCLUnreservedName__Alternatives ) ) ;
    public final void ruleEssentialOCLUnreservedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1209:2: ( ( ( rule__EssentialOCLUnreservedName__Alternatives ) ) )
            // InternalOCLinEcore.g:1210:1: ( ( rule__EssentialOCLUnreservedName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1210:1: ( ( rule__EssentialOCLUnreservedName__Alternatives ) )
            // InternalOCLinEcore.g:1211:1: ( rule__EssentialOCLUnreservedName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnreservedNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1212:1: ( rule__EssentialOCLUnreservedName__Alternatives )
            // InternalOCLinEcore.g:1212:2: rule__EssentialOCLUnreservedName__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EssentialOCLUnreservedName__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEssentialOCLUnreservedNameAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleEssentialOCLUnreservedName"


    // $ANTLR start "entryRuleUnreservedName"
    // InternalOCLinEcore.g:1224:1: entryRuleUnreservedName : ruleUnreservedName EOF ;
    public final void entryRuleUnreservedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1225:1: ( ruleUnreservedName EOF )
            // InternalOCLinEcore.g:1226:1: ruleUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleUnreservedName();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleUnreservedName"


    // $ANTLR start "ruleUnreservedName"
    // InternalOCLinEcore.g:1233:1: ruleUnreservedName : ( ruleEssentialOCLUnreservedName ) ;
    public final void ruleUnreservedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1237:2: ( ( ruleEssentialOCLUnreservedName ) )
            // InternalOCLinEcore.g:1238:1: ( ruleEssentialOCLUnreservedName )
            {
            // InternalOCLinEcore.g:1238:1: ( ruleEssentialOCLUnreservedName )
            // InternalOCLinEcore.g:1239:1: ruleEssentialOCLUnreservedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnreservedNameAccess().getEssentialOCLUnreservedNameParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEssentialOCLUnreservedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnreservedNameAccess().getEssentialOCLUnreservedNameParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleUnreservedName"


    // $ANTLR start "entryRuleURIPathNameCS"
    // InternalOCLinEcore.g:1252:1: entryRuleURIPathNameCS : ruleURIPathNameCS EOF ;
    public final void entryRuleURIPathNameCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1253:1: ( ruleURIPathNameCS EOF )
            // InternalOCLinEcore.g:1254:1: ruleURIPathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleURIPathNameCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleURIPathNameCS"


    // $ANTLR start "ruleURIPathNameCS"
    // InternalOCLinEcore.g:1261:1: ruleURIPathNameCS : ( ( rule__URIPathNameCS__Group__0 ) ) ;
    public final void ruleURIPathNameCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1265:2: ( ( ( rule__URIPathNameCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1266:1: ( ( rule__URIPathNameCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1266:1: ( ( rule__URIPathNameCS__Group__0 ) )
            // InternalOCLinEcore.g:1267:1: ( rule__URIPathNameCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1268:1: ( rule__URIPathNameCS__Group__0 )
            // InternalOCLinEcore.g:1268:2: rule__URIPathNameCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleURIPathNameCS"


    // $ANTLR start "entryRuleURIFirstPathElementCS"
    // InternalOCLinEcore.g:1280:1: entryRuleURIFirstPathElementCS : ruleURIFirstPathElementCS EOF ;
    public final void entryRuleURIFirstPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1281:1: ( ruleURIFirstPathElementCS EOF )
            // InternalOCLinEcore.g:1282:1: ruleURIFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleURIFirstPathElementCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleURIFirstPathElementCS"


    // $ANTLR start "ruleURIFirstPathElementCS"
    // InternalOCLinEcore.g:1289:1: ruleURIFirstPathElementCS : ( ( rule__URIFirstPathElementCS__Alternatives ) ) ;
    public final void ruleURIFirstPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1293:2: ( ( ( rule__URIFirstPathElementCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1294:1: ( ( rule__URIFirstPathElementCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1294:1: ( ( rule__URIFirstPathElementCS__Alternatives ) )
            // InternalOCLinEcore.g:1295:1: ( rule__URIFirstPathElementCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1296:1: ( rule__URIFirstPathElementCS__Alternatives )
            // InternalOCLinEcore.g:1296:2: rule__URIFirstPathElementCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIFirstPathElementCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleURIFirstPathElementCS"


    // $ANTLR start "entryRulePrimitiveTypeIdentifier"
    // InternalOCLinEcore.g:1310:1: entryRulePrimitiveTypeIdentifier : rulePrimitiveTypeIdentifier EOF ;
    public final void entryRulePrimitiveTypeIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1311:1: ( rulePrimitiveTypeIdentifier EOF )
            // InternalOCLinEcore.g:1312:1: rulePrimitiveTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrimitiveTypeIdentifier();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrimitiveTypeIdentifier"


    // $ANTLR start "rulePrimitiveTypeIdentifier"
    // InternalOCLinEcore.g:1319:1: rulePrimitiveTypeIdentifier : ( ( rule__PrimitiveTypeIdentifier__Alternatives ) ) ;
    public final void rulePrimitiveTypeIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1323:2: ( ( ( rule__PrimitiveTypeIdentifier__Alternatives ) ) )
            // InternalOCLinEcore.g:1324:1: ( ( rule__PrimitiveTypeIdentifier__Alternatives ) )
            {
            // InternalOCLinEcore.g:1324:1: ( ( rule__PrimitiveTypeIdentifier__Alternatives ) )
            // InternalOCLinEcore.g:1325:1: ( rule__PrimitiveTypeIdentifier__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeIdentifierAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1326:1: ( rule__PrimitiveTypeIdentifier__Alternatives )
            // InternalOCLinEcore.g:1326:2: rule__PrimitiveTypeIdentifier__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrimitiveTypeIdentifier__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrimitiveTypeIdentifierAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrimitiveTypeIdentifier"


    // $ANTLR start "entryRulePrimitiveTypeCS"
    // InternalOCLinEcore.g:1338:1: entryRulePrimitiveTypeCS : rulePrimitiveTypeCS EOF ;
    public final void entryRulePrimitiveTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1339:1: ( rulePrimitiveTypeCS EOF )
            // InternalOCLinEcore.g:1340:1: rulePrimitiveTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrimitiveTypeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrimitiveTypeCS"


    // $ANTLR start "rulePrimitiveTypeCS"
    // InternalOCLinEcore.g:1347:1: rulePrimitiveTypeCS : ( ( rule__PrimitiveTypeCS__NameAssignment ) ) ;
    public final void rulePrimitiveTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1351:2: ( ( ( rule__PrimitiveTypeCS__NameAssignment ) ) )
            // InternalOCLinEcore.g:1352:1: ( ( rule__PrimitiveTypeCS__NameAssignment ) )
            {
            // InternalOCLinEcore.g:1352:1: ( ( rule__PrimitiveTypeCS__NameAssignment ) )
            // InternalOCLinEcore.g:1353:1: ( rule__PrimitiveTypeCS__NameAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeCSAccess().getNameAssignment());
            }
            // InternalOCLinEcore.g:1354:1: ( rule__PrimitiveTypeCS__NameAssignment )
            // InternalOCLinEcore.g:1354:2: rule__PrimitiveTypeCS__NameAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrimitiveTypeCS__NameAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrimitiveTypeCSAccess().getNameAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrimitiveTypeCS"


    // $ANTLR start "entryRuleCollectionTypeIdentifier"
    // InternalOCLinEcore.g:1366:1: entryRuleCollectionTypeIdentifier : ruleCollectionTypeIdentifier EOF ;
    public final void entryRuleCollectionTypeIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1367:1: ( ruleCollectionTypeIdentifier EOF )
            // InternalOCLinEcore.g:1368:1: ruleCollectionTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCollectionTypeIdentifier();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCollectionTypeIdentifier"


    // $ANTLR start "ruleCollectionTypeIdentifier"
    // InternalOCLinEcore.g:1375:1: ruleCollectionTypeIdentifier : ( ( rule__CollectionTypeIdentifier__Alternatives ) ) ;
    public final void ruleCollectionTypeIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1379:2: ( ( ( rule__CollectionTypeIdentifier__Alternatives ) ) )
            // InternalOCLinEcore.g:1380:1: ( ( rule__CollectionTypeIdentifier__Alternatives ) )
            {
            // InternalOCLinEcore.g:1380:1: ( ( rule__CollectionTypeIdentifier__Alternatives ) )
            // InternalOCLinEcore.g:1381:1: ( rule__CollectionTypeIdentifier__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeIdentifierAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1382:1: ( rule__CollectionTypeIdentifier__Alternatives )
            // InternalOCLinEcore.g:1382:2: rule__CollectionTypeIdentifier__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeIdentifier__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeIdentifierAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCollectionTypeIdentifier"


    // $ANTLR start "entryRuleCollectionTypeCS"
    // InternalOCLinEcore.g:1394:1: entryRuleCollectionTypeCS : ruleCollectionTypeCS EOF ;
    public final void entryRuleCollectionTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1395:1: ( ruleCollectionTypeCS EOF )
            // InternalOCLinEcore.g:1396:1: ruleCollectionTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCollectionTypeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCollectionTypeCS"


    // $ANTLR start "ruleCollectionTypeCS"
    // InternalOCLinEcore.g:1403:1: ruleCollectionTypeCS : ( ( rule__CollectionTypeCS__Group__0 ) ) ;
    public final void ruleCollectionTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1407:2: ( ( ( rule__CollectionTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1408:1: ( ( rule__CollectionTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1408:1: ( ( rule__CollectionTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1409:1: ( rule__CollectionTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1410:1: ( rule__CollectionTypeCS__Group__0 )
            // InternalOCLinEcore.g:1410:2: rule__CollectionTypeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCollectionTypeCS"


    // $ANTLR start "entryRuleMapTypeCS"
    // InternalOCLinEcore.g:1422:1: entryRuleMapTypeCS : ruleMapTypeCS EOF ;
    public final void entryRuleMapTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1423:1: ( ruleMapTypeCS EOF )
            // InternalOCLinEcore.g:1424:1: ruleMapTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMapTypeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMapTypeCS"


    // $ANTLR start "ruleMapTypeCS"
    // InternalOCLinEcore.g:1431:1: ruleMapTypeCS : ( ( rule__MapTypeCS__Group__0 ) ) ;
    public final void ruleMapTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1435:2: ( ( ( rule__MapTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1436:1: ( ( rule__MapTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1436:1: ( ( rule__MapTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1437:1: ( rule__MapTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1438:1: ( rule__MapTypeCS__Group__0 )
            // InternalOCLinEcore.g:1438:2: rule__MapTypeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMapTypeCS"


    // $ANTLR start "entryRuleTupleTypeCS"
    // InternalOCLinEcore.g:1450:1: entryRuleTupleTypeCS : ruleTupleTypeCS EOF ;
    public final void entryRuleTupleTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1451:1: ( ruleTupleTypeCS EOF )
            // InternalOCLinEcore.g:1452:1: ruleTupleTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTupleTypeCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTupleTypeCS"


    // $ANTLR start "ruleTupleTypeCS"
    // InternalOCLinEcore.g:1459:1: ruleTupleTypeCS : ( ( rule__TupleTypeCS__Group__0 ) ) ;
    public final void ruleTupleTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1463:2: ( ( ( rule__TupleTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1464:1: ( ( rule__TupleTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1464:1: ( ( rule__TupleTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1465:1: ( rule__TupleTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1466:1: ( rule__TupleTypeCS__Group__0 )
            // InternalOCLinEcore.g:1466:2: rule__TupleTypeCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTupleTypeCS"


    // $ANTLR start "entryRuleTuplePartCS"
    // InternalOCLinEcore.g:1478:1: entryRuleTuplePartCS : ruleTuplePartCS EOF ;
    public final void entryRuleTuplePartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1479:1: ( ruleTuplePartCS EOF )
            // InternalOCLinEcore.g:1480:1: ruleTuplePartCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTuplePartCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTuplePartCS"


    // $ANTLR start "ruleTuplePartCS"
    // InternalOCLinEcore.g:1487:1: ruleTuplePartCS : ( ( rule__TuplePartCS__Group__0 ) ) ;
    public final void ruleTuplePartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1491:2: ( ( ( rule__TuplePartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1492:1: ( ( rule__TuplePartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1492:1: ( ( rule__TuplePartCS__Group__0 ) )
            // InternalOCLinEcore.g:1493:1: ( rule__TuplePartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1494:1: ( rule__TuplePartCS__Group__0 )
            // InternalOCLinEcore.g:1494:2: rule__TuplePartCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTuplePartCS"


    // $ANTLR start "entryRuleCollectionLiteralExpCS"
    // InternalOCLinEcore.g:1506:1: entryRuleCollectionLiteralExpCS : ruleCollectionLiteralExpCS EOF ;
    public final void entryRuleCollectionLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1507:1: ( ruleCollectionLiteralExpCS EOF )
            // InternalOCLinEcore.g:1508:1: ruleCollectionLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCollectionLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCollectionLiteralExpCS"


    // $ANTLR start "ruleCollectionLiteralExpCS"
    // InternalOCLinEcore.g:1515:1: ruleCollectionLiteralExpCS : ( ( rule__CollectionLiteralExpCS__Group__0 ) ) ;
    public final void ruleCollectionLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1519:2: ( ( ( rule__CollectionLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1520:1: ( ( rule__CollectionLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1520:1: ( ( rule__CollectionLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1521:1: ( rule__CollectionLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1522:1: ( rule__CollectionLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1522:2: rule__CollectionLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCollectionLiteralExpCS"


    // $ANTLR start "entryRuleCollectionLiteralPartCS"
    // InternalOCLinEcore.g:1534:1: entryRuleCollectionLiteralPartCS : ruleCollectionLiteralPartCS EOF ;
    public final void entryRuleCollectionLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1535:1: ( ruleCollectionLiteralPartCS EOF )
            // InternalOCLinEcore.g:1536:1: ruleCollectionLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCollectionLiteralPartCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCollectionLiteralPartCS"


    // $ANTLR start "ruleCollectionLiteralPartCS"
    // InternalOCLinEcore.g:1543:1: ruleCollectionLiteralPartCS : ( ( rule__CollectionLiteralPartCS__Alternatives ) ) ;
    public final void ruleCollectionLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1547:2: ( ( ( rule__CollectionLiteralPartCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1548:1: ( ( rule__CollectionLiteralPartCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1548:1: ( ( rule__CollectionLiteralPartCS__Alternatives ) )
            // InternalOCLinEcore.g:1549:1: ( rule__CollectionLiteralPartCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1550:1: ( rule__CollectionLiteralPartCS__Alternatives )
            // InternalOCLinEcore.g:1550:2: rule__CollectionLiteralPartCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCollectionLiteralPartCS"


    // $ANTLR start "entryRuleCollectionPatternCS"
    // InternalOCLinEcore.g:1562:1: entryRuleCollectionPatternCS : ruleCollectionPatternCS EOF ;
    public final void entryRuleCollectionPatternCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1563:1: ( ruleCollectionPatternCS EOF )
            // InternalOCLinEcore.g:1564:1: ruleCollectionPatternCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCollectionPatternCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCollectionPatternCS"


    // $ANTLR start "ruleCollectionPatternCS"
    // InternalOCLinEcore.g:1571:1: ruleCollectionPatternCS : ( ( rule__CollectionPatternCS__Group__0 ) ) ;
    public final void ruleCollectionPatternCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1575:2: ( ( ( rule__CollectionPatternCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1576:1: ( ( rule__CollectionPatternCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1576:1: ( ( rule__CollectionPatternCS__Group__0 ) )
            // InternalOCLinEcore.g:1577:1: ( rule__CollectionPatternCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1578:1: ( rule__CollectionPatternCS__Group__0 )
            // InternalOCLinEcore.g:1578:2: rule__CollectionPatternCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCollectionPatternCS"


    // $ANTLR start "entryRuleShadowPartCS"
    // InternalOCLinEcore.g:1590:1: entryRuleShadowPartCS : ruleShadowPartCS EOF ;
    public final void entryRuleShadowPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1591:1: ( ruleShadowPartCS EOF )
            // InternalOCLinEcore.g:1592:1: ruleShadowPartCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleShadowPartCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleShadowPartCS"


    // $ANTLR start "ruleShadowPartCS"
    // InternalOCLinEcore.g:1599:1: ruleShadowPartCS : ( ( rule__ShadowPartCS__Alternatives ) ) ;
    public final void ruleShadowPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1603:2: ( ( ( rule__ShadowPartCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1604:1: ( ( rule__ShadowPartCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1604:1: ( ( rule__ShadowPartCS__Alternatives ) )
            // InternalOCLinEcore.g:1605:1: ( rule__ShadowPartCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1606:1: ( rule__ShadowPartCS__Alternatives )
            // InternalOCLinEcore.g:1606:2: rule__ShadowPartCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleShadowPartCS"


    // $ANTLR start "entryRulePatternExpCS"
    // InternalOCLinEcore.g:1618:1: entryRulePatternExpCS : rulePatternExpCS EOF ;
    public final void entryRulePatternExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1619:1: ( rulePatternExpCS EOF )
            // InternalOCLinEcore.g:1620:1: rulePatternExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePatternExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePatternExpCS"


    // $ANTLR start "rulePatternExpCS"
    // InternalOCLinEcore.g:1627:1: rulePatternExpCS : ( ( rule__PatternExpCS__Group__0 ) ) ;
    public final void rulePatternExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1631:2: ( ( ( rule__PatternExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1632:1: ( ( rule__PatternExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1632:1: ( ( rule__PatternExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1633:1: ( rule__PatternExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1634:1: ( rule__PatternExpCS__Group__0 )
            // InternalOCLinEcore.g:1634:2: rule__PatternExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PatternExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePatternExpCS"


    // $ANTLR start "entryRuleLambdaLiteralExpCS"
    // InternalOCLinEcore.g:1646:1: entryRuleLambdaLiteralExpCS : ruleLambdaLiteralExpCS EOF ;
    public final void entryRuleLambdaLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1647:1: ( ruleLambdaLiteralExpCS EOF )
            // InternalOCLinEcore.g:1648:1: ruleLambdaLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleLambdaLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleLambdaLiteralExpCS"


    // $ANTLR start "ruleLambdaLiteralExpCS"
    // InternalOCLinEcore.g:1655:1: ruleLambdaLiteralExpCS : ( ( rule__LambdaLiteralExpCS__Group__0 ) ) ;
    public final void ruleLambdaLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1659:2: ( ( ( rule__LambdaLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1660:1: ( ( rule__LambdaLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1660:1: ( ( rule__LambdaLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1661:1: ( rule__LambdaLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1662:1: ( rule__LambdaLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1662:2: rule__LambdaLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLambdaLiteralExpCS"


    // $ANTLR start "entryRuleMapLiteralExpCS"
    // InternalOCLinEcore.g:1674:1: entryRuleMapLiteralExpCS : ruleMapLiteralExpCS EOF ;
    public final void entryRuleMapLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1675:1: ( ruleMapLiteralExpCS EOF )
            // InternalOCLinEcore.g:1676:1: ruleMapLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMapLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMapLiteralExpCS"


    // $ANTLR start "ruleMapLiteralExpCS"
    // InternalOCLinEcore.g:1683:1: ruleMapLiteralExpCS : ( ( rule__MapLiteralExpCS__Group__0 ) ) ;
    public final void ruleMapLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1687:2: ( ( ( rule__MapLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1688:1: ( ( rule__MapLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1688:1: ( ( rule__MapLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1689:1: ( rule__MapLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1690:1: ( rule__MapLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1690:2: rule__MapLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMapLiteralExpCS"


    // $ANTLR start "entryRuleMapLiteralPartCS"
    // InternalOCLinEcore.g:1702:1: entryRuleMapLiteralPartCS : ruleMapLiteralPartCS EOF ;
    public final void entryRuleMapLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1703:1: ( ruleMapLiteralPartCS EOF )
            // InternalOCLinEcore.g:1704:1: ruleMapLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMapLiteralPartCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMapLiteralPartCS"


    // $ANTLR start "ruleMapLiteralPartCS"
    // InternalOCLinEcore.g:1711:1: ruleMapLiteralPartCS : ( ( rule__MapLiteralPartCS__Group__0 ) ) ;
    public final void ruleMapLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1715:2: ( ( ( rule__MapLiteralPartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1716:1: ( ( rule__MapLiteralPartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1716:1: ( ( rule__MapLiteralPartCS__Group__0 ) )
            // InternalOCLinEcore.g:1717:1: ( rule__MapLiteralPartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1718:1: ( rule__MapLiteralPartCS__Group__0 )
            // InternalOCLinEcore.g:1718:2: rule__MapLiteralPartCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMapLiteralPartCS"


    // $ANTLR start "entryRulePrimitiveLiteralExpCS"
    // InternalOCLinEcore.g:1730:1: entryRulePrimitiveLiteralExpCS : rulePrimitiveLiteralExpCS EOF ;
    public final void entryRulePrimitiveLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1731:1: ( rulePrimitiveLiteralExpCS EOF )
            // InternalOCLinEcore.g:1732:1: rulePrimitiveLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrimitiveLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrimitiveLiteralExpCS"


    // $ANTLR start "rulePrimitiveLiteralExpCS"
    // InternalOCLinEcore.g:1739:1: rulePrimitiveLiteralExpCS : ( ( rule__PrimitiveLiteralExpCS__Alternatives ) ) ;
    public final void rulePrimitiveLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1743:2: ( ( ( rule__PrimitiveLiteralExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1744:1: ( ( rule__PrimitiveLiteralExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1744:1: ( ( rule__PrimitiveLiteralExpCS__Alternatives ) )
            // InternalOCLinEcore.g:1745:1: ( rule__PrimitiveLiteralExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveLiteralExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1746:1: ( rule__PrimitiveLiteralExpCS__Alternatives )
            // InternalOCLinEcore.g:1746:2: rule__PrimitiveLiteralExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrimitiveLiteralExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrimitiveLiteralExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrimitiveLiteralExpCS"


    // $ANTLR start "entryRuleTupleLiteralExpCS"
    // InternalOCLinEcore.g:1758:1: entryRuleTupleLiteralExpCS : ruleTupleLiteralExpCS EOF ;
    public final void entryRuleTupleLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1759:1: ( ruleTupleLiteralExpCS EOF )
            // InternalOCLinEcore.g:1760:1: ruleTupleLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTupleLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTupleLiteralExpCS"


    // $ANTLR start "ruleTupleLiteralExpCS"
    // InternalOCLinEcore.g:1767:1: ruleTupleLiteralExpCS : ( ( rule__TupleLiteralExpCS__Group__0 ) ) ;
    public final void ruleTupleLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1771:2: ( ( ( rule__TupleLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1772:1: ( ( rule__TupleLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1772:1: ( ( rule__TupleLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1773:1: ( rule__TupleLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1774:1: ( rule__TupleLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1774:2: rule__TupleLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTupleLiteralExpCS"


    // $ANTLR start "entryRuleTupleLiteralPartCS"
    // InternalOCLinEcore.g:1786:1: entryRuleTupleLiteralPartCS : ruleTupleLiteralPartCS EOF ;
    public final void entryRuleTupleLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1787:1: ( ruleTupleLiteralPartCS EOF )
            // InternalOCLinEcore.g:1788:1: ruleTupleLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTupleLiteralPartCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTupleLiteralPartCS"


    // $ANTLR start "ruleTupleLiteralPartCS"
    // InternalOCLinEcore.g:1795:1: ruleTupleLiteralPartCS : ( ( rule__TupleLiteralPartCS__Group__0 ) ) ;
    public final void ruleTupleLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1799:2: ( ( ( rule__TupleLiteralPartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1800:1: ( ( rule__TupleLiteralPartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1800:1: ( ( rule__TupleLiteralPartCS__Group__0 ) )
            // InternalOCLinEcore.g:1801:1: ( rule__TupleLiteralPartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1802:1: ( rule__TupleLiteralPartCS__Group__0 )
            // InternalOCLinEcore.g:1802:2: rule__TupleLiteralPartCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTupleLiteralPartCS"


    // $ANTLR start "entryRuleNumberLiteralExpCS"
    // InternalOCLinEcore.g:1814:1: entryRuleNumberLiteralExpCS : ruleNumberLiteralExpCS EOF ;
    public final void entryRuleNumberLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1815:1: ( ruleNumberLiteralExpCS EOF )
            // InternalOCLinEcore.g:1816:1: ruleNumberLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNumberLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNumberLiteralExpCS"


    // $ANTLR start "ruleNumberLiteralExpCS"
    // InternalOCLinEcore.g:1823:1: ruleNumberLiteralExpCS : ( ( rule__NumberLiteralExpCS__SymbolAssignment ) ) ;
    public final void ruleNumberLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1827:2: ( ( ( rule__NumberLiteralExpCS__SymbolAssignment ) ) )
            // InternalOCLinEcore.g:1828:1: ( ( rule__NumberLiteralExpCS__SymbolAssignment ) )
            {
            // InternalOCLinEcore.g:1828:1: ( ( rule__NumberLiteralExpCS__SymbolAssignment ) )
            // InternalOCLinEcore.g:1829:1: ( rule__NumberLiteralExpCS__SymbolAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolAssignment());
            }
            // InternalOCLinEcore.g:1830:1: ( rule__NumberLiteralExpCS__SymbolAssignment )
            // InternalOCLinEcore.g:1830:2: rule__NumberLiteralExpCS__SymbolAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NumberLiteralExpCS__SymbolAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNumberLiteralExpCSAccess().getSymbolAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNumberLiteralExpCS"


    // $ANTLR start "entryRuleStringLiteralExpCS"
    // InternalOCLinEcore.g:1842:1: entryRuleStringLiteralExpCS : ruleStringLiteralExpCS EOF ;
    public final void entryRuleStringLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1843:1: ( ruleStringLiteralExpCS EOF )
            // InternalOCLinEcore.g:1844:1: ruleStringLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleStringLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStringLiteralExpCS"


    // $ANTLR start "ruleStringLiteralExpCS"
    // InternalOCLinEcore.g:1851:1: ruleStringLiteralExpCS : ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) ) ;
    public final void ruleStringLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1855:2: ( ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) ) )
            // InternalOCLinEcore.g:1856:1: ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) )
            {
            // InternalOCLinEcore.g:1856:1: ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) )
            // InternalOCLinEcore.g:1857:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* )
            {
            // InternalOCLinEcore.g:1857:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment ) )
            // InternalOCLinEcore.g:1858:1: ( rule__StringLiteralExpCS__SegmentsAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }
            // InternalOCLinEcore.g:1859:1: ( rule__StringLiteralExpCS__SegmentsAssignment )
            // InternalOCLinEcore.g:1859:2: rule__StringLiteralExpCS__SegmentsAssignment
            {
            pushFollow(FollowSets000.FOLLOW_3);
            rule__StringLiteralExpCS__SegmentsAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }

            }

            // InternalOCLinEcore.g:1862:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment )* )
            // InternalOCLinEcore.g:1863:1: ( rule__StringLiteralExpCS__SegmentsAssignment )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }
            // InternalOCLinEcore.g:1864:1: ( rule__StringLiteralExpCS__SegmentsAssignment )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

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


                switch (alt1) {
            	case 1 :
            	    // InternalOCLinEcore.g:1864:2: rule__StringLiteralExpCS__SegmentsAssignment
            	    {
            	    pushFollow(FollowSets000.FOLLOW_3);
            	    rule__StringLiteralExpCS__SegmentsAssignment();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStringLiteralExpCS"


    // $ANTLR start "entryRuleBooleanLiteralExpCS"
    // InternalOCLinEcore.g:1877:1: entryRuleBooleanLiteralExpCS : ruleBooleanLiteralExpCS EOF ;
    public final void entryRuleBooleanLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1878:1: ( ruleBooleanLiteralExpCS EOF )
            // InternalOCLinEcore.g:1879:1: ruleBooleanLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleBooleanLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleBooleanLiteralExpCS"


    // $ANTLR start "ruleBooleanLiteralExpCS"
    // InternalOCLinEcore.g:1886:1: ruleBooleanLiteralExpCS : ( ( rule__BooleanLiteralExpCS__Alternatives ) ) ;
    public final void ruleBooleanLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1890:2: ( ( ( rule__BooleanLiteralExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1891:1: ( ( rule__BooleanLiteralExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1891:1: ( ( rule__BooleanLiteralExpCS__Alternatives ) )
            // InternalOCLinEcore.g:1892:1: ( rule__BooleanLiteralExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1893:1: ( rule__BooleanLiteralExpCS__Alternatives )
            // InternalOCLinEcore.g:1893:2: rule__BooleanLiteralExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__BooleanLiteralExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getBooleanLiteralExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleBooleanLiteralExpCS"


    // $ANTLR start "entryRuleUnlimitedNaturalLiteralExpCS"
    // InternalOCLinEcore.g:1905:1: entryRuleUnlimitedNaturalLiteralExpCS : ruleUnlimitedNaturalLiteralExpCS EOF ;
    public final void entryRuleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1906:1: ( ruleUnlimitedNaturalLiteralExpCS EOF )
            // InternalOCLinEcore.g:1907:1: ruleUnlimitedNaturalLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleUnlimitedNaturalLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleUnlimitedNaturalLiteralExpCS"


    // $ANTLR start "ruleUnlimitedNaturalLiteralExpCS"
    // InternalOCLinEcore.g:1914:1: ruleUnlimitedNaturalLiteralExpCS : ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) ) ;
    public final void ruleUnlimitedNaturalLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1918:2: ( ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1919:1: ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1919:1: ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1920:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1921:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1921:2: rule__UnlimitedNaturalLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__UnlimitedNaturalLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleUnlimitedNaturalLiteralExpCS"


    // $ANTLR start "entryRuleInvalidLiteralExpCS"
    // InternalOCLinEcore.g:1933:1: entryRuleInvalidLiteralExpCS : ruleInvalidLiteralExpCS EOF ;
    public final void entryRuleInvalidLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1934:1: ( ruleInvalidLiteralExpCS EOF )
            // InternalOCLinEcore.g:1935:1: ruleInvalidLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleInvalidLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleInvalidLiteralExpCS"


    // $ANTLR start "ruleInvalidLiteralExpCS"
    // InternalOCLinEcore.g:1942:1: ruleInvalidLiteralExpCS : ( ( rule__InvalidLiteralExpCS__Group__0 ) ) ;
    public final void ruleInvalidLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1946:2: ( ( ( rule__InvalidLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1947:1: ( ( rule__InvalidLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1947:1: ( ( rule__InvalidLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1948:1: ( rule__InvalidLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1949:1: ( rule__InvalidLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1949:2: rule__InvalidLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvalidLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvalidLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleInvalidLiteralExpCS"


    // $ANTLR start "entryRuleNullLiteralExpCS"
    // InternalOCLinEcore.g:1961:1: entryRuleNullLiteralExpCS : ruleNullLiteralExpCS EOF ;
    public final void entryRuleNullLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1962:1: ( ruleNullLiteralExpCS EOF )
            // InternalOCLinEcore.g:1963:1: ruleNullLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNullLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNullLiteralExpCS"


    // $ANTLR start "ruleNullLiteralExpCS"
    // InternalOCLinEcore.g:1970:1: ruleNullLiteralExpCS : ( ( rule__NullLiteralExpCS__Group__0 ) ) ;
    public final void ruleNullLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1974:2: ( ( ( rule__NullLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1975:1: ( ( rule__NullLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1975:1: ( ( rule__NullLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1976:1: ( rule__NullLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1977:1: ( rule__NullLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1977:2: rule__NullLiteralExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NullLiteralExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNullLiteralExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNullLiteralExpCS"


    // $ANTLR start "entryRuleTypeLiteralCS"
    // InternalOCLinEcore.g:1989:1: entryRuleTypeLiteralCS : ruleTypeLiteralCS EOF ;
    public final void entryRuleTypeLiteralCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1990:1: ( ruleTypeLiteralCS EOF )
            // InternalOCLinEcore.g:1991:1: ruleTypeLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeLiteralCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeLiteralCS"


    // $ANTLR start "ruleTypeLiteralCS"
    // InternalOCLinEcore.g:1998:1: ruleTypeLiteralCS : ( ( rule__TypeLiteralCS__Alternatives ) ) ;
    public final void ruleTypeLiteralCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2002:2: ( ( ( rule__TypeLiteralCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2003:1: ( ( rule__TypeLiteralCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2003:1: ( ( rule__TypeLiteralCS__Alternatives ) )
            // InternalOCLinEcore.g:2004:1: ( rule__TypeLiteralCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2005:1: ( rule__TypeLiteralCS__Alternatives )
            // InternalOCLinEcore.g:2005:2: rule__TypeLiteralCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeLiteralCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeLiteralCS"


    // $ANTLR start "entryRuleTypeLiteralWithMultiplicityCS"
    // InternalOCLinEcore.g:2017:1: entryRuleTypeLiteralWithMultiplicityCS : ruleTypeLiteralWithMultiplicityCS EOF ;
    public final void entryRuleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2018:1: ( ruleTypeLiteralWithMultiplicityCS EOF )
            // InternalOCLinEcore.g:2019:1: ruleTypeLiteralWithMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeLiteralWithMultiplicityCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeLiteralWithMultiplicityCS"


    // $ANTLR start "ruleTypeLiteralWithMultiplicityCS"
    // InternalOCLinEcore.g:2026:1: ruleTypeLiteralWithMultiplicityCS : ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) ) ;
    public final void ruleTypeLiteralWithMultiplicityCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2030:2: ( ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2031:1: ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2031:1: ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) )
            // InternalOCLinEcore.g:2032:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2033:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0 )
            // InternalOCLinEcore.g:2033:2: rule__TypeLiteralWithMultiplicityCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeLiteralWithMultiplicityCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeLiteralWithMultiplicityCS"


    // $ANTLR start "entryRuleTypeLiteralExpCS"
    // InternalOCLinEcore.g:2045:1: entryRuleTypeLiteralExpCS : ruleTypeLiteralExpCS EOF ;
    public final void entryRuleTypeLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2046:1: ( ruleTypeLiteralExpCS EOF )
            // InternalOCLinEcore.g:2047:1: ruleTypeLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeLiteralExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeLiteralExpCS"


    // $ANTLR start "ruleTypeLiteralExpCS"
    // InternalOCLinEcore.g:2054:1: ruleTypeLiteralExpCS : ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) ) ;
    public final void ruleTypeLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2058:2: ( ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) ) )
            // InternalOCLinEcore.g:2059:1: ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) )
            {
            // InternalOCLinEcore.g:2059:1: ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) )
            // InternalOCLinEcore.g:2060:1: ( rule__TypeLiteralExpCS__OwnedTypeAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeAssignment());
            }
            // InternalOCLinEcore.g:2061:1: ( rule__TypeLiteralExpCS__OwnedTypeAssignment )
            // InternalOCLinEcore.g:2061:2: rule__TypeLiteralExpCS__OwnedTypeAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeLiteralExpCS__OwnedTypeAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeLiteralExpCS"


    // $ANTLR start "entryRuleTypeNameExpCS"
    // InternalOCLinEcore.g:2073:1: entryRuleTypeNameExpCS : ruleTypeNameExpCS EOF ;
    public final void entryRuleTypeNameExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2074:1: ( ruleTypeNameExpCS EOF )
            // InternalOCLinEcore.g:2075:1: ruleTypeNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeNameExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeNameExpCS"


    // $ANTLR start "ruleTypeNameExpCS"
    // InternalOCLinEcore.g:2082:1: ruleTypeNameExpCS : ( ( rule__TypeNameExpCS__Group__0 ) ) ;
    public final void ruleTypeNameExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2086:2: ( ( ( rule__TypeNameExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2087:1: ( ( rule__TypeNameExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2087:1: ( ( rule__TypeNameExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2088:1: ( rule__TypeNameExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2089:1: ( rule__TypeNameExpCS__Group__0 )
            // InternalOCLinEcore.g:2089:2: rule__TypeNameExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeNameExpCS"


    // $ANTLR start "entryRuleTypeExpWithoutMultiplicityCS"
    // InternalOCLinEcore.g:2101:1: entryRuleTypeExpWithoutMultiplicityCS : ruleTypeExpWithoutMultiplicityCS EOF ;
    public final void entryRuleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2102:1: ( ruleTypeExpWithoutMultiplicityCS EOF )
            // InternalOCLinEcore.g:2103:1: ruleTypeExpWithoutMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpWithoutMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeExpWithoutMultiplicityCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeExpWithoutMultiplicityCS"


    // $ANTLR start "ruleTypeExpWithoutMultiplicityCS"
    // InternalOCLinEcore.g:2110:1: ruleTypeExpWithoutMultiplicityCS : ( ( rule__TypeExpWithoutMultiplicityCS__Alternatives ) ) ;
    public final void ruleTypeExpWithoutMultiplicityCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2114:2: ( ( ( rule__TypeExpWithoutMultiplicityCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2115:1: ( ( rule__TypeExpWithoutMultiplicityCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2115:1: ( ( rule__TypeExpWithoutMultiplicityCS__Alternatives ) )
            // InternalOCLinEcore.g:2116:1: ( rule__TypeExpWithoutMultiplicityCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2117:1: ( rule__TypeExpWithoutMultiplicityCS__Alternatives )
            // InternalOCLinEcore.g:2117:2: rule__TypeExpWithoutMultiplicityCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeExpWithoutMultiplicityCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeExpWithoutMultiplicityCS"


    // $ANTLR start "entryRuleTypeExpCS"
    // InternalOCLinEcore.g:2129:1: entryRuleTypeExpCS : ruleTypeExpCS EOF ;
    public final void entryRuleTypeExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2130:1: ( ruleTypeExpCS EOF )
            // InternalOCLinEcore.g:2131:1: ruleTypeExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeExpCS"


    // $ANTLR start "ruleTypeExpCS"
    // InternalOCLinEcore.g:2138:1: ruleTypeExpCS : ( ( rule__TypeExpCS__Group__0 ) ) ;
    public final void ruleTypeExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2142:2: ( ( ( rule__TypeExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2143:1: ( ( rule__TypeExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2143:1: ( ( rule__TypeExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2144:1: ( rule__TypeExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2145:1: ( rule__TypeExpCS__Group__0 )
            // InternalOCLinEcore.g:2145:2: rule__TypeExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeExpCS"


    // $ANTLR start "entryRuleExpCS"
    // InternalOCLinEcore.g:2157:1: entryRuleExpCS : ruleExpCS EOF ;
    public final void entryRuleExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2158:1: ( ruleExpCS EOF )
            // InternalOCLinEcore.g:2159:1: ruleExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleExpCS"


    // $ANTLR start "ruleExpCS"
    // InternalOCLinEcore.g:2166:1: ruleExpCS : ( ( rule__ExpCS__Alternatives ) ) ;
    public final void ruleExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2170:2: ( ( ( rule__ExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2171:1: ( ( rule__ExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2171:1: ( ( rule__ExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2172:1: ( rule__ExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2173:1: ( rule__ExpCS__Alternatives )
            // InternalOCLinEcore.g:2173:2: rule__ExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleExpCS"


    // $ANTLR start "entryRulePrefixedLetExpCS"
    // InternalOCLinEcore.g:2185:1: entryRulePrefixedLetExpCS : rulePrefixedLetExpCS EOF ;
    public final void entryRulePrefixedLetExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2186:1: ( rulePrefixedLetExpCS EOF )
            // InternalOCLinEcore.g:2187:1: rulePrefixedLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrefixedLetExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrefixedLetExpCS"


    // $ANTLR start "rulePrefixedLetExpCS"
    // InternalOCLinEcore.g:2194:1: rulePrefixedLetExpCS : ( ( rule__PrefixedLetExpCS__Alternatives ) ) ;
    public final void rulePrefixedLetExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2198:2: ( ( ( rule__PrefixedLetExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2199:1: ( ( rule__PrefixedLetExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2199:1: ( ( rule__PrefixedLetExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2200:1: ( rule__PrefixedLetExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2201:1: ( rule__PrefixedLetExpCS__Alternatives )
            // InternalOCLinEcore.g:2201:2: rule__PrefixedLetExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrefixedLetExpCS"


    // $ANTLR start "entryRulePrefixedPrimaryExpCS"
    // InternalOCLinEcore.g:2213:1: entryRulePrefixedPrimaryExpCS : rulePrefixedPrimaryExpCS EOF ;
    public final void entryRulePrefixedPrimaryExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2214:1: ( rulePrefixedPrimaryExpCS EOF )
            // InternalOCLinEcore.g:2215:1: rulePrefixedPrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrefixedPrimaryExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrefixedPrimaryExpCS"


    // $ANTLR start "rulePrefixedPrimaryExpCS"
    // InternalOCLinEcore.g:2222:1: rulePrefixedPrimaryExpCS : ( ( rule__PrefixedPrimaryExpCS__Alternatives ) ) ;
    public final void rulePrefixedPrimaryExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2226:2: ( ( ( rule__PrefixedPrimaryExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2227:1: ( ( rule__PrefixedPrimaryExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2227:1: ( ( rule__PrefixedPrimaryExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2228:1: ( rule__PrefixedPrimaryExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2229:1: ( rule__PrefixedPrimaryExpCS__Alternatives )
            // InternalOCLinEcore.g:2229:2: rule__PrefixedPrimaryExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrefixedPrimaryExpCS"


    // $ANTLR start "entryRulePrimaryExpCS"
    // InternalOCLinEcore.g:2241:1: entryRulePrimaryExpCS : rulePrimaryExpCS EOF ;
    public final void entryRulePrimaryExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2242:1: ( rulePrimaryExpCS EOF )
            // InternalOCLinEcore.g:2243:1: rulePrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePrimaryExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePrimaryExpCS"


    // $ANTLR start "rulePrimaryExpCS"
    // InternalOCLinEcore.g:2250:1: rulePrimaryExpCS : ( ( rule__PrimaryExpCS__Alternatives ) ) ;
    public final void rulePrimaryExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2254:2: ( ( ( rule__PrimaryExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2255:1: ( ( rule__PrimaryExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2255:1: ( ( rule__PrimaryExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2256:1: ( rule__PrimaryExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimaryExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2257:1: ( rule__PrimaryExpCS__Alternatives )
            // InternalOCLinEcore.g:2257:2: rule__PrimaryExpCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrimaryExpCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrimaryExpCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePrimaryExpCS"


    // $ANTLR start "entryRuleNameExpCS"
    // InternalOCLinEcore.g:2269:1: entryRuleNameExpCS : ruleNameExpCS EOF ;
    public final void entryRuleNameExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2270:1: ( ruleNameExpCS EOF )
            // InternalOCLinEcore.g:2271:1: ruleNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNameExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNameExpCS"


    // $ANTLR start "ruleNameExpCS"
    // InternalOCLinEcore.g:2278:1: ruleNameExpCS : ( ( rule__NameExpCS__Group__0 ) ) ;
    public final void ruleNameExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2282:2: ( ( ( rule__NameExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2283:1: ( ( rule__NameExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2283:1: ( ( rule__NameExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2284:1: ( rule__NameExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2285:1: ( rule__NameExpCS__Group__0 )
            // InternalOCLinEcore.g:2285:2: rule__NameExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNameExpCS"


    // $ANTLR start "entryRuleCurlyBracketedClauseCS"
    // InternalOCLinEcore.g:2297:1: entryRuleCurlyBracketedClauseCS : ruleCurlyBracketedClauseCS EOF ;
    public final void entryRuleCurlyBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2298:1: ( ruleCurlyBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2299:1: ruleCurlyBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCurlyBracketedClauseCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCurlyBracketedClauseCS"


    // $ANTLR start "ruleCurlyBracketedClauseCS"
    // InternalOCLinEcore.g:2306:1: ruleCurlyBracketedClauseCS : ( ( rule__CurlyBracketedClauseCS__Group__0 ) ) ;
    public final void ruleCurlyBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2310:2: ( ( ( rule__CurlyBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2311:1: ( ( rule__CurlyBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2311:1: ( ( rule__CurlyBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2312:1: ( rule__CurlyBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2313:1: ( rule__CurlyBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2313:2: rule__CurlyBracketedClauseCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCurlyBracketedClauseCS"


    // $ANTLR start "entryRuleRoundBracketedClauseCS"
    // InternalOCLinEcore.g:2325:1: entryRuleRoundBracketedClauseCS : ruleRoundBracketedClauseCS EOF ;
    public final void entryRuleRoundBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2326:1: ( ruleRoundBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2327:1: ruleRoundBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleRoundBracketedClauseCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleRoundBracketedClauseCS"


    // $ANTLR start "ruleRoundBracketedClauseCS"
    // InternalOCLinEcore.g:2334:1: ruleRoundBracketedClauseCS : ( ( rule__RoundBracketedClauseCS__Group__0 ) ) ;
    public final void ruleRoundBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2338:2: ( ( ( rule__RoundBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2339:1: ( ( rule__RoundBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2339:1: ( ( rule__RoundBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2340:1: ( rule__RoundBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2341:1: ( rule__RoundBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2341:2: rule__RoundBracketedClauseCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleRoundBracketedClauseCS"


    // $ANTLR start "entryRuleSquareBracketedClauseCS"
    // InternalOCLinEcore.g:2353:1: entryRuleSquareBracketedClauseCS : ruleSquareBracketedClauseCS EOF ;
    public final void entryRuleSquareBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2354:1: ( ruleSquareBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2355:1: ruleSquareBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleSquareBracketedClauseCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleSquareBracketedClauseCS"


    // $ANTLR start "ruleSquareBracketedClauseCS"
    // InternalOCLinEcore.g:2362:1: ruleSquareBracketedClauseCS : ( ( rule__SquareBracketedClauseCS__Group__0 ) ) ;
    public final void ruleSquareBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2366:2: ( ( ( rule__SquareBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2367:1: ( ( rule__SquareBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2367:1: ( ( rule__SquareBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2368:1: ( rule__SquareBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2369:1: ( rule__SquareBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2369:2: rule__SquareBracketedClauseCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleSquareBracketedClauseCS"


    // $ANTLR start "entryRuleNavigatingArgCS"
    // InternalOCLinEcore.g:2381:1: entryRuleNavigatingArgCS : ruleNavigatingArgCS EOF ;
    public final void entryRuleNavigatingArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2382:1: ( ruleNavigatingArgCS EOF )
            // InternalOCLinEcore.g:2383:1: ruleNavigatingArgCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigatingArgCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigatingArgCS"


    // $ANTLR start "ruleNavigatingArgCS"
    // InternalOCLinEcore.g:2390:1: ruleNavigatingArgCS : ( ( rule__NavigatingArgCS__Alternatives ) ) ;
    public final void ruleNavigatingArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2394:2: ( ( ( rule__NavigatingArgCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2395:1: ( ( rule__NavigatingArgCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2395:1: ( ( rule__NavigatingArgCS__Alternatives ) )
            // InternalOCLinEcore.g:2396:1: ( rule__NavigatingArgCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2397:1: ( rule__NavigatingArgCS__Alternatives )
            // InternalOCLinEcore.g:2397:2: rule__NavigatingArgCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigatingArgCS"


    // $ANTLR start "entryRuleNavigatingBarArgCS"
    // InternalOCLinEcore.g:2409:1: entryRuleNavigatingBarArgCS : ruleNavigatingBarArgCS EOF ;
    public final void entryRuleNavigatingBarArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2410:1: ( ruleNavigatingBarArgCS EOF )
            // InternalOCLinEcore.g:2411:1: ruleNavigatingBarArgCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigatingBarArgCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigatingBarArgCS"


    // $ANTLR start "ruleNavigatingBarArgCS"
    // InternalOCLinEcore.g:2418:1: ruleNavigatingBarArgCS : ( ( rule__NavigatingBarArgCS__Group__0 ) ) ;
    public final void ruleNavigatingBarArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2422:2: ( ( ( rule__NavigatingBarArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2423:1: ( ( rule__NavigatingBarArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2423:1: ( ( rule__NavigatingBarArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2424:1: ( rule__NavigatingBarArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2425:1: ( rule__NavigatingBarArgCS__Group__0 )
            // InternalOCLinEcore.g:2425:2: rule__NavigatingBarArgCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigatingBarArgCS"


    // $ANTLR start "entryRuleNavigatingCommaArgCS"
    // InternalOCLinEcore.g:2437:1: entryRuleNavigatingCommaArgCS : ruleNavigatingCommaArgCS EOF ;
    public final void entryRuleNavigatingCommaArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2438:1: ( ruleNavigatingCommaArgCS EOF )
            // InternalOCLinEcore.g:2439:1: ruleNavigatingCommaArgCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigatingCommaArgCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigatingCommaArgCS"


    // $ANTLR start "ruleNavigatingCommaArgCS"
    // InternalOCLinEcore.g:2446:1: ruleNavigatingCommaArgCS : ( ( rule__NavigatingCommaArgCS__Group__0 ) ) ;
    public final void ruleNavigatingCommaArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2450:2: ( ( ( rule__NavigatingCommaArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2451:1: ( ( rule__NavigatingCommaArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2451:1: ( ( rule__NavigatingCommaArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2452:1: ( rule__NavigatingCommaArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2453:1: ( rule__NavigatingCommaArgCS__Group__0 )
            // InternalOCLinEcore.g:2453:2: rule__NavigatingCommaArgCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigatingCommaArgCS"


    // $ANTLR start "entryRuleNavigatingSemiArgCS"
    // InternalOCLinEcore.g:2465:1: entryRuleNavigatingSemiArgCS : ruleNavigatingSemiArgCS EOF ;
    public final void entryRuleNavigatingSemiArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2466:1: ( ruleNavigatingSemiArgCS EOF )
            // InternalOCLinEcore.g:2467:1: ruleNavigatingSemiArgCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigatingSemiArgCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigatingSemiArgCS"


    // $ANTLR start "ruleNavigatingSemiArgCS"
    // InternalOCLinEcore.g:2474:1: ruleNavigatingSemiArgCS : ( ( rule__NavigatingSemiArgCS__Group__0 ) ) ;
    public final void ruleNavigatingSemiArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2478:2: ( ( ( rule__NavigatingSemiArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2479:1: ( ( rule__NavigatingSemiArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2479:1: ( ( rule__NavigatingSemiArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2480:1: ( rule__NavigatingSemiArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2481:1: ( rule__NavigatingSemiArgCS__Group__0 )
            // InternalOCLinEcore.g:2481:2: rule__NavigatingSemiArgCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigatingSemiArgCS"


    // $ANTLR start "entryRuleNavigatingArgExpCS"
    // InternalOCLinEcore.g:2493:1: entryRuleNavigatingArgExpCS : ruleNavigatingArgExpCS EOF ;
    public final void entryRuleNavigatingArgExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2494:1: ( ruleNavigatingArgExpCS EOF )
            // InternalOCLinEcore.g:2495:1: ruleNavigatingArgExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNavigatingArgExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNavigatingArgExpCS"


    // $ANTLR start "ruleNavigatingArgExpCS"
    // InternalOCLinEcore.g:2502:1: ruleNavigatingArgExpCS : ( ruleExpCS ) ;
    public final void ruleNavigatingArgExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2506:2: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:2507:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:2507:1: ( ruleExpCS )
            // InternalOCLinEcore.g:2508:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgExpCSAccess().getExpCSParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgExpCSAccess().getExpCSParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNavigatingArgExpCS"


    // $ANTLR start "entryRuleCoIteratorVariableCS"
    // InternalOCLinEcore.g:2521:1: entryRuleCoIteratorVariableCS : ruleCoIteratorVariableCS EOF ;
    public final void entryRuleCoIteratorVariableCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2522:1: ( ruleCoIteratorVariableCS EOF )
            // InternalOCLinEcore.g:2523:1: ruleCoIteratorVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleCoIteratorVariableCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleCoIteratorVariableCS"


    // $ANTLR start "ruleCoIteratorVariableCS"
    // InternalOCLinEcore.g:2530:1: ruleCoIteratorVariableCS : ( ( rule__CoIteratorVariableCS__Group__0 ) ) ;
    public final void ruleCoIteratorVariableCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2534:2: ( ( ( rule__CoIteratorVariableCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2535:1: ( ( rule__CoIteratorVariableCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2535:1: ( ( rule__CoIteratorVariableCS__Group__0 ) )
            // InternalOCLinEcore.g:2536:1: ( rule__CoIteratorVariableCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2537:1: ( rule__CoIteratorVariableCS__Group__0 )
            // InternalOCLinEcore.g:2537:2: rule__CoIteratorVariableCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleCoIteratorVariableCS"


    // $ANTLR start "entryRuleIfExpCS"
    // InternalOCLinEcore.g:2549:1: entryRuleIfExpCS : ruleIfExpCS EOF ;
    public final void entryRuleIfExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2550:1: ( ruleIfExpCS EOF )
            // InternalOCLinEcore.g:2551:1: ruleIfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleIfExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleIfExpCS"


    // $ANTLR start "ruleIfExpCS"
    // InternalOCLinEcore.g:2558:1: ruleIfExpCS : ( ( rule__IfExpCS__Group__0 ) ) ;
    public final void ruleIfExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2562:2: ( ( ( rule__IfExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2563:1: ( ( rule__IfExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2563:1: ( ( rule__IfExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2564:1: ( rule__IfExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2565:1: ( rule__IfExpCS__Group__0 )
            // InternalOCLinEcore.g:2565:2: rule__IfExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleIfExpCS"


    // $ANTLR start "entryRuleElseIfThenExpCS"
    // InternalOCLinEcore.g:2577:1: entryRuleElseIfThenExpCS : ruleElseIfThenExpCS EOF ;
    public final void entryRuleElseIfThenExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2578:1: ( ruleElseIfThenExpCS EOF )
            // InternalOCLinEcore.g:2579:1: ruleElseIfThenExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleElseIfThenExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleElseIfThenExpCS"


    // $ANTLR start "ruleElseIfThenExpCS"
    // InternalOCLinEcore.g:2586:1: ruleElseIfThenExpCS : ( ( rule__ElseIfThenExpCS__Group__0 ) ) ;
    public final void ruleElseIfThenExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2590:2: ( ( ( rule__ElseIfThenExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2591:1: ( ( rule__ElseIfThenExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2591:1: ( ( rule__ElseIfThenExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2592:1: ( rule__ElseIfThenExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2593:1: ( rule__ElseIfThenExpCS__Group__0 )
            // InternalOCLinEcore.g:2593:2: rule__ElseIfThenExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleElseIfThenExpCS"


    // $ANTLR start "entryRuleLetExpCS"
    // InternalOCLinEcore.g:2605:1: entryRuleLetExpCS : ruleLetExpCS EOF ;
    public final void entryRuleLetExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2606:1: ( ruleLetExpCS EOF )
            // InternalOCLinEcore.g:2607:1: ruleLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleLetExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleLetExpCS"


    // $ANTLR start "ruleLetExpCS"
    // InternalOCLinEcore.g:2614:1: ruleLetExpCS : ( ( rule__LetExpCS__Group__0 ) ) ;
    public final void ruleLetExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2618:2: ( ( ( rule__LetExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2619:1: ( ( rule__LetExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2619:1: ( ( rule__LetExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2620:1: ( rule__LetExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2621:1: ( rule__LetExpCS__Group__0 )
            // InternalOCLinEcore.g:2621:2: rule__LetExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLetExpCS"


    // $ANTLR start "entryRuleLetVariableCS"
    // InternalOCLinEcore.g:2633:1: entryRuleLetVariableCS : ruleLetVariableCS EOF ;
    public final void entryRuleLetVariableCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2634:1: ( ruleLetVariableCS EOF )
            // InternalOCLinEcore.g:2635:1: ruleLetVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleLetVariableCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleLetVariableCS"


    // $ANTLR start "ruleLetVariableCS"
    // InternalOCLinEcore.g:2642:1: ruleLetVariableCS : ( ( rule__LetVariableCS__Group__0 ) ) ;
    public final void ruleLetVariableCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2646:2: ( ( ( rule__LetVariableCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2647:1: ( ( rule__LetVariableCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2647:1: ( ( rule__LetVariableCS__Group__0 ) )
            // InternalOCLinEcore.g:2648:1: ( rule__LetVariableCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2649:1: ( rule__LetVariableCS__Group__0 )
            // InternalOCLinEcore.g:2649:2: rule__LetVariableCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLetVariableCS"


    // $ANTLR start "entryRuleNestedExpCS"
    // InternalOCLinEcore.g:2661:1: entryRuleNestedExpCS : ruleNestedExpCS EOF ;
    public final void entryRuleNestedExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2662:1: ( ruleNestedExpCS EOF )
            // InternalOCLinEcore.g:2663:1: ruleNestedExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNestedExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNestedExpCS"


    // $ANTLR start "ruleNestedExpCS"
    // InternalOCLinEcore.g:2670:1: ruleNestedExpCS : ( ( rule__NestedExpCS__Group__0 ) ) ;
    public final void ruleNestedExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2674:2: ( ( ( rule__NestedExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2675:1: ( ( rule__NestedExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2675:1: ( ( rule__NestedExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2676:1: ( rule__NestedExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2677:1: ( rule__NestedExpCS__Group__0 )
            // InternalOCLinEcore.g:2677:2: rule__NestedExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NestedExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNestedExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNestedExpCS"


    // $ANTLR start "entryRuleSelfExpCS"
    // InternalOCLinEcore.g:2689:1: entryRuleSelfExpCS : ruleSelfExpCS EOF ;
    public final void entryRuleSelfExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2690:1: ( ruleSelfExpCS EOF )
            // InternalOCLinEcore.g:2691:1: ruleSelfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleSelfExpCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleSelfExpCS"


    // $ANTLR start "ruleSelfExpCS"
    // InternalOCLinEcore.g:2698:1: ruleSelfExpCS : ( ( rule__SelfExpCS__Group__0 ) ) ;
    public final void ruleSelfExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2702:2: ( ( ( rule__SelfExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2703:1: ( ( rule__SelfExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2703:1: ( ( rule__SelfExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2704:1: ( rule__SelfExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2705:1: ( rule__SelfExpCS__Group__0 )
            // InternalOCLinEcore.g:2705:2: rule__SelfExpCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SelfExpCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSelfExpCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleSelfExpCS"


    // $ANTLR start "entryRuleMultiplicityBoundsCS"
    // InternalOCLinEcore.g:2717:1: entryRuleMultiplicityBoundsCS : ruleMultiplicityBoundsCS EOF ;
    public final void entryRuleMultiplicityBoundsCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2718:1: ( ruleMultiplicityBoundsCS EOF )
            // InternalOCLinEcore.g:2719:1: ruleMultiplicityBoundsCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMultiplicityBoundsCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMultiplicityBoundsCS"


    // $ANTLR start "ruleMultiplicityBoundsCS"
    // InternalOCLinEcore.g:2726:1: ruleMultiplicityBoundsCS : ( ( rule__MultiplicityBoundsCS__Group__0 ) ) ;
    public final void ruleMultiplicityBoundsCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2730:2: ( ( ( rule__MultiplicityBoundsCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2731:1: ( ( rule__MultiplicityBoundsCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2731:1: ( ( rule__MultiplicityBoundsCS__Group__0 ) )
            // InternalOCLinEcore.g:2732:1: ( rule__MultiplicityBoundsCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2733:1: ( rule__MultiplicityBoundsCS__Group__0 )
            // InternalOCLinEcore.g:2733:2: rule__MultiplicityBoundsCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMultiplicityBoundsCS"


    // $ANTLR start "entryRuleMultiplicityCS"
    // InternalOCLinEcore.g:2745:1: entryRuleMultiplicityCS : ruleMultiplicityCS EOF ;
    public final void entryRuleMultiplicityCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2746:1: ( ruleMultiplicityCS EOF )
            // InternalOCLinEcore.g:2747:1: ruleMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMultiplicityCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMultiplicityCS"


    // $ANTLR start "ruleMultiplicityCS"
    // InternalOCLinEcore.g:2754:1: ruleMultiplicityCS : ( ( rule__MultiplicityCS__Group__0 ) ) ;
    public final void ruleMultiplicityCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2758:2: ( ( ( rule__MultiplicityCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2759:1: ( ( rule__MultiplicityCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2759:1: ( ( rule__MultiplicityCS__Group__0 ) )
            // InternalOCLinEcore.g:2760:1: ( rule__MultiplicityCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2761:1: ( rule__MultiplicityCS__Group__0 )
            // InternalOCLinEcore.g:2761:2: rule__MultiplicityCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMultiplicityCS"


    // $ANTLR start "entryRuleMultiplicityStringCS"
    // InternalOCLinEcore.g:2773:1: entryRuleMultiplicityStringCS : ruleMultiplicityStringCS EOF ;
    public final void entryRuleMultiplicityStringCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2774:1: ( ruleMultiplicityStringCS EOF )
            // InternalOCLinEcore.g:2775:1: ruleMultiplicityStringCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityStringCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleMultiplicityStringCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleMultiplicityStringCS"


    // $ANTLR start "ruleMultiplicityStringCS"
    // InternalOCLinEcore.g:2782:1: ruleMultiplicityStringCS : ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) ) ;
    public final void ruleMultiplicityStringCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2786:2: ( ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) ) )
            // InternalOCLinEcore.g:2787:1: ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) )
            {
            // InternalOCLinEcore.g:2787:1: ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) )
            // InternalOCLinEcore.g:2788:1: ( rule__MultiplicityStringCS__StringBoundsAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment());
            }
            // InternalOCLinEcore.g:2789:1: ( rule__MultiplicityStringCS__StringBoundsAssignment )
            // InternalOCLinEcore.g:2789:2: rule__MultiplicityStringCS__StringBoundsAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityStringCS__StringBoundsAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleMultiplicityStringCS"


    // $ANTLR start "entryRulePathNameCS"
    // InternalOCLinEcore.g:2801:1: entryRulePathNameCS : rulePathNameCS EOF ;
    public final void entryRulePathNameCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2802:1: ( rulePathNameCS EOF )
            // InternalOCLinEcore.g:2803:1: rulePathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            rulePathNameCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRulePathNameCS"


    // $ANTLR start "rulePathNameCS"
    // InternalOCLinEcore.g:2810:1: rulePathNameCS : ( ( rule__PathNameCS__Group__0 ) ) ;
    public final void rulePathNameCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2814:2: ( ( ( rule__PathNameCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2815:1: ( ( rule__PathNameCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2815:1: ( ( rule__PathNameCS__Group__0 ) )
            // InternalOCLinEcore.g:2816:1: ( rule__PathNameCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2817:1: ( rule__PathNameCS__Group__0 )
            // InternalOCLinEcore.g:2817:2: rule__PathNameCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rulePathNameCS"


    // $ANTLR start "entryRuleFirstPathElementCS"
    // InternalOCLinEcore.g:2831:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
    public final void entryRuleFirstPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2832:1: ( ruleFirstPathElementCS EOF )
            // InternalOCLinEcore.g:2833:1: ruleFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleFirstPathElementCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFirstPathElementCS"


    // $ANTLR start "ruleFirstPathElementCS"
    // InternalOCLinEcore.g:2840:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
    public final void ruleFirstPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2844:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
            // InternalOCLinEcore.g:2845:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
            {
            // InternalOCLinEcore.g:2845:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
            // InternalOCLinEcore.g:2846:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
            }
            // InternalOCLinEcore.g:2847:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
            // InternalOCLinEcore.g:2847:2: rule__FirstPathElementCS__ReferredElementAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__FirstPathElementCS__ReferredElementAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFirstPathElementCS"


    // $ANTLR start "entryRuleNextPathElementCS"
    // InternalOCLinEcore.g:2859:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
    public final void entryRuleNextPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2860:1: ( ruleNextPathElementCS EOF )
            // InternalOCLinEcore.g:2861:1: ruleNextPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNextPathElementCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNextPathElementCS"


    // $ANTLR start "ruleNextPathElementCS"
    // InternalOCLinEcore.g:2868:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
    public final void ruleNextPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2872:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
            // InternalOCLinEcore.g:2873:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
            {
            // InternalOCLinEcore.g:2873:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
            // InternalOCLinEcore.g:2874:1: ( rule__NextPathElementCS__ReferredElementAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
            }
            // InternalOCLinEcore.g:2875:1: ( rule__NextPathElementCS__ReferredElementAssignment )
            // InternalOCLinEcore.g:2875:2: rule__NextPathElementCS__ReferredElementAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NextPathElementCS__ReferredElementAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNextPathElementCS"


    // $ANTLR start "entryRuleTemplateBindingCS"
    // InternalOCLinEcore.g:2887:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
    public final void entryRuleTemplateBindingCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2888:1: ( ruleTemplateBindingCS EOF )
            // InternalOCLinEcore.g:2889:1: ruleTemplateBindingCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTemplateBindingCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTemplateBindingCS"


    // $ANTLR start "ruleTemplateBindingCS"
    // InternalOCLinEcore.g:2896:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
    public final void ruleTemplateBindingCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2900:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2901:1: ( ( rule__TemplateBindingCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2901:1: ( ( rule__TemplateBindingCS__Group__0 ) )
            // InternalOCLinEcore.g:2902:1: ( rule__TemplateBindingCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2903:1: ( rule__TemplateBindingCS__Group__0 )
            // InternalOCLinEcore.g:2903:2: rule__TemplateBindingCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTemplateBindingCS"


    // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
    // InternalOCLinEcore.g:2915:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
    public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2916:1: ( ruleTemplateParameterSubstitutionCS EOF )
            // InternalOCLinEcore.g:2917:1: ruleTemplateParameterSubstitutionCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateParameterSubstitutionCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTemplateParameterSubstitutionCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTemplateParameterSubstitutionCS"


    // $ANTLR start "ruleTemplateParameterSubstitutionCS"
    // InternalOCLinEcore.g:2924:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
    public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2928:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
            // InternalOCLinEcore.g:2929:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
            {
            // InternalOCLinEcore.g:2929:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
            // InternalOCLinEcore.g:2930:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
            }
            // InternalOCLinEcore.g:2931:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
            // InternalOCLinEcore.g:2931:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTemplateParameterSubstitutionCS"


    // $ANTLR start "entryRuleTypeParameterCS"
    // InternalOCLinEcore.g:2943:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
    public final void entryRuleTypeParameterCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2944:1: ( ruleTypeParameterCS EOF )
            // InternalOCLinEcore.g:2945:1: ruleTypeParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeParameterCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeParameterCS"


    // $ANTLR start "ruleTypeParameterCS"
    // InternalOCLinEcore.g:2952:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
    public final void ruleTypeParameterCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2956:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2957:1: ( ( rule__TypeParameterCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2957:1: ( ( rule__TypeParameterCS__Group__0 ) )
            // InternalOCLinEcore.g:2958:1: ( rule__TypeParameterCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2959:1: ( rule__TypeParameterCS__Group__0 )
            // InternalOCLinEcore.g:2959:2: rule__TypeParameterCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeParameterCS"


    // $ANTLR start "entryRuleTypeRefCS"
    // InternalOCLinEcore.g:2971:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
    public final void entryRuleTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2972:1: ( ruleTypeRefCS EOF )
            // InternalOCLinEcore.g:2973:1: ruleTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleTypeRefCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTypeRefCS"


    // $ANTLR start "ruleTypeRefCS"
    // InternalOCLinEcore.g:2980:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
    public final void ruleTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2984:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2985:1: ( ( rule__TypeRefCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2985:1: ( ( rule__TypeRefCS__Alternatives ) )
            // InternalOCLinEcore.g:2986:1: ( rule__TypeRefCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeRefCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2987:1: ( rule__TypeRefCS__Alternatives )
            // InternalOCLinEcore.g:2987:2: rule__TypeRefCS__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeRefCS__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeRefCSAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTypeRefCS"


    // $ANTLR start "entryRuleWildcardTypeRefCS"
    // InternalOCLinEcore.g:2999:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
    public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3000:1: ( ruleWildcardTypeRefCS EOF )
            // InternalOCLinEcore.g:3001:1: ruleWildcardTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleWildcardTypeRefCS();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleWildcardTypeRefCS"


    // $ANTLR start "ruleWildcardTypeRefCS"
    // InternalOCLinEcore.g:3008:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
    public final void ruleWildcardTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3012:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:3013:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:3013:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
            // InternalOCLinEcore.g:3014:1: ( rule__WildcardTypeRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:3015:1: ( rule__WildcardTypeRefCS__Group__0 )
            // InternalOCLinEcore.g:3015:2: rule__WildcardTypeRefCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleWildcardTypeRefCS"


    // $ANTLR start "entryRuleID"
    // InternalOCLinEcore.g:3027:1: entryRuleID : ruleID EOF ;
    public final void entryRuleID() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3028:1: ( ruleID EOF )
            // InternalOCLinEcore.g:3029:1: ruleID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleID();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleID"


    // $ANTLR start "ruleID"
    // InternalOCLinEcore.g:3036:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
    public final void ruleID() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3040:2: ( ( ( rule__ID__Alternatives ) ) )
            // InternalOCLinEcore.g:3041:1: ( ( rule__ID__Alternatives ) )
            {
            // InternalOCLinEcore.g:3041:1: ( ( rule__ID__Alternatives ) )
            // InternalOCLinEcore.g:3042:1: ( rule__ID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIDAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:3043:1: ( rule__ID__Alternatives )
            // InternalOCLinEcore.g:3043:2: rule__ID__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ID__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIDAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleID"


    // $ANTLR start "entryRuleIdentifier"
    // InternalOCLinEcore.g:3055:1: entryRuleIdentifier : ruleIdentifier EOF ;
    public final void entryRuleIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3056:1: ( ruleIdentifier EOF )
            // InternalOCLinEcore.g:3057:1: ruleIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleIdentifier();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleIdentifier"


    // $ANTLR start "ruleIdentifier"
    // InternalOCLinEcore.g:3064:1: ruleIdentifier : ( ruleID ) ;
    public final void ruleIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3068:2: ( ( ruleID ) )
            // InternalOCLinEcore.g:3069:1: ( ruleID )
            {
            // InternalOCLinEcore.g:3069:1: ( ruleID )
            // InternalOCLinEcore.g:3070:1: ruleID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleID();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleIdentifier"


    // $ANTLR start "entryRuleLOWER"
    // InternalOCLinEcore.g:3083:1: entryRuleLOWER : ruleLOWER EOF ;
    public final void entryRuleLOWER() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3084:1: ( ruleLOWER EOF )
            // InternalOCLinEcore.g:3085:1: ruleLOWER EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLOWERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleLOWER();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleLOWER"


    // $ANTLR start "ruleLOWER"
    // InternalOCLinEcore.g:3092:1: ruleLOWER : ( RULE_INT ) ;
    public final void ruleLOWER() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3096:2: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:3097:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:3097:1: ( RULE_INT )
            // InternalOCLinEcore.g:3098:1: RULE_INT
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
            }
            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleLOWER"


    // $ANTLR start "entryRuleNUMBER_LITERAL"
    // InternalOCLinEcore.g:3111:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
    public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3112:1: ( ruleNUMBER_LITERAL EOF )
            // InternalOCLinEcore.g:3113:1: ruleNUMBER_LITERAL EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNUMBER_LITERALRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleNUMBER_LITERAL();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleNUMBER_LITERAL"


    // $ANTLR start "ruleNUMBER_LITERAL"
    // InternalOCLinEcore.g:3120:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
    public final void ruleNUMBER_LITERAL() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3124:2: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:3125:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:3125:1: ( RULE_INT )
            // InternalOCLinEcore.g:3126:1: RULE_INT
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
            }
            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleNUMBER_LITERAL"


    // $ANTLR start "entryRuleStringLiteral"
    // InternalOCLinEcore.g:3139:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
    public final void entryRuleStringLiteral() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3140:1: ( ruleStringLiteral EOF )
            // InternalOCLinEcore.g:3141:1: ruleStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleStringLiteral();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleStringLiteral"


    // $ANTLR start "ruleStringLiteral"
    // InternalOCLinEcore.g:3148:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void ruleStringLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3152:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:3153:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:3153:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:3154:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleStringLiteral"


    // $ANTLR start "entryRuleUPPER"
    // InternalOCLinEcore.g:3167:1: entryRuleUPPER : ruleUPPER EOF ;
    public final void entryRuleUPPER() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3168:1: ( ruleUPPER EOF )
            // InternalOCLinEcore.g:3169:1: ruleUPPER EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUPPERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleUPPER();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleUPPER"


    // $ANTLR start "ruleUPPER"
    // InternalOCLinEcore.g:3176:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
    public final void ruleUPPER() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3180:2: ( ( ( rule__UPPER__Alternatives ) ) )
            // InternalOCLinEcore.g:3181:1: ( ( rule__UPPER__Alternatives ) )
            {
            // InternalOCLinEcore.g:3181:1: ( ( rule__UPPER__Alternatives ) )
            // InternalOCLinEcore.g:3182:1: ( rule__UPPER__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUPPERAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:3183:1: ( rule__UPPER__Alternatives )
            // InternalOCLinEcore.g:3183:2: rule__UPPER__Alternatives
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__UPPER__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getUPPERAccess().getAlternatives());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleUPPER"


    // $ANTLR start "entryRuleURI"
    // InternalOCLinEcore.g:3195:1: entryRuleURI : ruleURI EOF ;
    public final void entryRuleURI() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3196:1: ( ruleURI EOF )
            // InternalOCLinEcore.g:3197:1: ruleURI EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            ruleURI();

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

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleURI"


    // $ANTLR start "ruleURI"
    // InternalOCLinEcore.g:3204:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void ruleURI() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3208:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:3209:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:3209:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:3210:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleURI"


    // $ANTLR start "rule__EnumerationLiteralName__Alternatives"
    // InternalOCLinEcore.g:3223:1: rule__EnumerationLiteralName__Alternatives : ( ( ruleEssentialOCLUnrestrictedName ) | ( 'abstract' ) | ( 'attribute' ) | ( 'body' ) | ( 'callable' ) | ( 'class' ) | ( 'composes' ) | ( 'datatype' ) | ( 'definition' ) | ( 'derivation' ) | ( 'derived' ) | ( 'enum' ) | ( 'extends' ) | ( 'id' ) | ( 'import' ) | ( 'initial' ) | ( 'interface' ) | ( 'key' ) | ( 'library' ) | ( 'module' ) | ( 'operation' ) | ( 'ordered' ) | ( 'package' ) | ( 'postcondition' ) | ( 'precondition' ) | ( 'primitive' ) | ( 'property' ) | ( 'readonly' ) | ( 'reference' ) | ( 'resolve' ) | ( 'static' ) | ( 'throws' ) | ( 'transient' ) | ( 'unique' ) | ( 'unsettable' ) | ( 'volatile' ) );
    public final void rule__EnumerationLiteralName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

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

                throw nvae;
            }

            switch (alt2) {
                case 1 :
                    // InternalOCLinEcore.g:3228:1: ( ruleEssentialOCLUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3228:1: ( ruleEssentialOCLUnrestrictedName )
                    // InternalOCLinEcore.g:3229:1: ruleEssentialOCLUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleEssentialOCLUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3234:6: ( 'abstract' )
                    {
                    // InternalOCLinEcore.g:3234:6: ( 'abstract' )
                    // InternalOCLinEcore.g:3235:1: 'abstract'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getAbstractKeyword_1());
                    }
                    match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getAbstractKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3242:6: ( 'attribute' )
                    {
                    // InternalOCLinEcore.g:3242:6: ( 'attribute' )
                    // InternalOCLinEcore.g:3243:1: 'attribute'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getAttributeKeyword_2());
                    }
                    match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getAttributeKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:3250:6: ( 'body' )
                    {
                    // InternalOCLinEcore.g:3250:6: ( 'body' )
                    // InternalOCLinEcore.g:3251:1: 'body'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getBodyKeyword_3());
                    }
                    match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getBodyKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:3258:6: ( 'callable' )
                    {
                    // InternalOCLinEcore.g:3258:6: ( 'callable' )
                    // InternalOCLinEcore.g:3259:1: 'callable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getCallableKeyword_4());
                    }
                    match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getCallableKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:3266:6: ( 'class' )
                    {
                    // InternalOCLinEcore.g:3266:6: ( 'class' )
                    // InternalOCLinEcore.g:3267:1: 'class'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getClassKeyword_5());
                    }
                    match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getClassKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:3274:6: ( 'composes' )
                    {
                    // InternalOCLinEcore.g:3274:6: ( 'composes' )
                    // InternalOCLinEcore.g:3275:1: 'composes'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getComposesKeyword_6());
                    }
                    match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getComposesKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:3282:6: ( 'datatype' )
                    {
                    // InternalOCLinEcore.g:3282:6: ( 'datatype' )
                    // InternalOCLinEcore.g:3283:1: 'datatype'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getDatatypeKeyword_7());
                    }
                    match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getDatatypeKeyword_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:3290:6: ( 'definition' )
                    {
                    // InternalOCLinEcore.g:3290:6: ( 'definition' )
                    // InternalOCLinEcore.g:3291:1: 'definition'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getDefinitionKeyword_8());
                    }
                    match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getDefinitionKeyword_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:3298:6: ( 'derivation' )
                    {
                    // InternalOCLinEcore.g:3298:6: ( 'derivation' )
                    // InternalOCLinEcore.g:3299:1: 'derivation'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getDerivationKeyword_9());
                    }
                    match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getDerivationKeyword_9());
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:3306:6: ( 'derived' )
                    {
                    // InternalOCLinEcore.g:3306:6: ( 'derived' )
                    // InternalOCLinEcore.g:3307:1: 'derived'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getDerivedKeyword_10());
                    }
                    match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getDerivedKeyword_10());
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:3314:6: ( 'enum' )
                    {
                    // InternalOCLinEcore.g:3314:6: ( 'enum' )
                    // InternalOCLinEcore.g:3315:1: 'enum'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getEnumKeyword_11());
                    }
                    match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getEnumKeyword_11());
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:3322:6: ( 'extends' )
                    {
                    // InternalOCLinEcore.g:3322:6: ( 'extends' )
                    // InternalOCLinEcore.g:3323:1: 'extends'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getExtendsKeyword_12());
                    }
                    match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getExtendsKeyword_12());
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:3330:6: ( 'id' )
                    {
                    // InternalOCLinEcore.g:3330:6: ( 'id' )
                    // InternalOCLinEcore.g:3331:1: 'id'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getIdKeyword_13());
                    }
                    match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getIdKeyword_13());
                    }

                    }


                    }
                    break;
                case 15 :
                    // InternalOCLinEcore.g:3338:6: ( 'import' )
                    {
                    // InternalOCLinEcore.g:3338:6: ( 'import' )
                    // InternalOCLinEcore.g:3339:1: 'import'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getImportKeyword_14());
                    }
                    match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getImportKeyword_14());
                    }

                    }


                    }
                    break;
                case 16 :
                    // InternalOCLinEcore.g:3346:6: ( 'initial' )
                    {
                    // InternalOCLinEcore.g:3346:6: ( 'initial' )
                    // InternalOCLinEcore.g:3347:1: 'initial'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getInitialKeyword_15());
                    }
                    match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getInitialKeyword_15());
                    }

                    }


                    }
                    break;
                case 17 :
                    // InternalOCLinEcore.g:3354:6: ( 'interface' )
                    {
                    // InternalOCLinEcore.g:3354:6: ( 'interface' )
                    // InternalOCLinEcore.g:3355:1: 'interface'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getInterfaceKeyword_16());
                    }
                    match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getInterfaceKeyword_16());
                    }

                    }


                    }
                    break;
                case 18 :
                    // InternalOCLinEcore.g:3362:6: ( 'key' )
                    {
                    // InternalOCLinEcore.g:3362:6: ( 'key' )
                    // InternalOCLinEcore.g:3363:1: 'key'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getKeyKeyword_17());
                    }
                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getKeyKeyword_17());
                    }

                    }


                    }
                    break;
                case 19 :
                    // InternalOCLinEcore.g:3370:6: ( 'library' )
                    {
                    // InternalOCLinEcore.g:3370:6: ( 'library' )
                    // InternalOCLinEcore.g:3371:1: 'library'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getLibraryKeyword_18());
                    }
                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getLibraryKeyword_18());
                    }

                    }


                    }
                    break;
                case 20 :
                    // InternalOCLinEcore.g:3378:6: ( 'module' )
                    {
                    // InternalOCLinEcore.g:3378:6: ( 'module' )
                    // InternalOCLinEcore.g:3379:1: 'module'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getModuleKeyword_19());
                    }
                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getModuleKeyword_19());
                    }

                    }


                    }
                    break;
                case 21 :
                    // InternalOCLinEcore.g:3386:6: ( 'operation' )
                    {
                    // InternalOCLinEcore.g:3386:6: ( 'operation' )
                    // InternalOCLinEcore.g:3387:1: 'operation'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getOperationKeyword_20());
                    }
                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getOperationKeyword_20());
                    }

                    }


                    }
                    break;
                case 22 :
                    // InternalOCLinEcore.g:3394:6: ( 'ordered' )
                    {
                    // InternalOCLinEcore.g:3394:6: ( 'ordered' )
                    // InternalOCLinEcore.g:3395:1: 'ordered'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getOrderedKeyword_21());
                    }
                    match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getOrderedKeyword_21());
                    }

                    }


                    }
                    break;
                case 23 :
                    // InternalOCLinEcore.g:3402:6: ( 'package' )
                    {
                    // InternalOCLinEcore.g:3402:6: ( 'package' )
                    // InternalOCLinEcore.g:3403:1: 'package'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getPackageKeyword_22());
                    }
                    match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getPackageKeyword_22());
                    }

                    }


                    }
                    break;
                case 24 :
                    // InternalOCLinEcore.g:3410:6: ( 'postcondition' )
                    {
                    // InternalOCLinEcore.g:3410:6: ( 'postcondition' )
                    // InternalOCLinEcore.g:3411:1: 'postcondition'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getPostconditionKeyword_23());
                    }
                    match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getPostconditionKeyword_23());
                    }

                    }


                    }
                    break;
                case 25 :
                    // InternalOCLinEcore.g:3418:6: ( 'precondition' )
                    {
                    // InternalOCLinEcore.g:3418:6: ( 'precondition' )
                    // InternalOCLinEcore.g:3419:1: 'precondition'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getPreconditionKeyword_24());
                    }
                    match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getPreconditionKeyword_24());
                    }

                    }


                    }
                    break;
                case 26 :
                    // InternalOCLinEcore.g:3426:6: ( 'primitive' )
                    {
                    // InternalOCLinEcore.g:3426:6: ( 'primitive' )
                    // InternalOCLinEcore.g:3427:1: 'primitive'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getPrimitiveKeyword_25());
                    }
                    match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getPrimitiveKeyword_25());
                    }

                    }


                    }
                    break;
                case 27 :
                    // InternalOCLinEcore.g:3434:6: ( 'property' )
                    {
                    // InternalOCLinEcore.g:3434:6: ( 'property' )
                    // InternalOCLinEcore.g:3435:1: 'property'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getPropertyKeyword_26());
                    }
                    match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getPropertyKeyword_26());
                    }

                    }


                    }
                    break;
                case 28 :
                    // InternalOCLinEcore.g:3442:6: ( 'readonly' )
                    {
                    // InternalOCLinEcore.g:3442:6: ( 'readonly' )
                    // InternalOCLinEcore.g:3443:1: 'readonly'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getReadonlyKeyword_27());
                    }
                    match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getReadonlyKeyword_27());
                    }

                    }


                    }
                    break;
                case 29 :
                    // InternalOCLinEcore.g:3450:6: ( 'reference' )
                    {
                    // InternalOCLinEcore.g:3450:6: ( 'reference' )
                    // InternalOCLinEcore.g:3451:1: 'reference'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getReferenceKeyword_28());
                    }
                    match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getReferenceKeyword_28());
                    }

                    }


                    }
                    break;
                case 30 :
                    // InternalOCLinEcore.g:3458:6: ( 'resolve' )
                    {
                    // InternalOCLinEcore.g:3458:6: ( 'resolve' )
                    // InternalOCLinEcore.g:3459:1: 'resolve'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getResolveKeyword_29());
                    }
                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getResolveKeyword_29());
                    }

                    }


                    }
                    break;
                case 31 :
                    // InternalOCLinEcore.g:3466:6: ( 'static' )
                    {
                    // InternalOCLinEcore.g:3466:6: ( 'static' )
                    // InternalOCLinEcore.g:3467:1: 'static'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getStaticKeyword_30());
                    }
                    match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getStaticKeyword_30());
                    }

                    }


                    }
                    break;
                case 32 :
                    // InternalOCLinEcore.g:3474:6: ( 'throws' )
                    {
                    // InternalOCLinEcore.g:3474:6: ( 'throws' )
                    // InternalOCLinEcore.g:3475:1: 'throws'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getThrowsKeyword_31());
                    }
                    match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getThrowsKeyword_31());
                    }

                    }


                    }
                    break;
                case 33 :
                    // InternalOCLinEcore.g:3482:6: ( 'transient' )
                    {
                    // InternalOCLinEcore.g:3482:6: ( 'transient' )
                    // InternalOCLinEcore.g:3483:1: 'transient'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getTransientKeyword_32());
                    }
                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getTransientKeyword_32());
                    }

                    }


                    }
                    break;
                case 34 :
                    // InternalOCLinEcore.g:3490:6: ( 'unique' )
                    {
                    // InternalOCLinEcore.g:3490:6: ( 'unique' )
                    // InternalOCLinEcore.g:3491:1: 'unique'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getUniqueKeyword_33());
                    }
                    match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getUniqueKeyword_33());
                    }

                    }


                    }
                    break;
                case 35 :
                    // InternalOCLinEcore.g:3498:6: ( 'unsettable' )
                    {
                    // InternalOCLinEcore.g:3498:6: ( 'unsettable' )
                    // InternalOCLinEcore.g:3499:1: 'unsettable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getUnsettableKeyword_34());
                    }
                    match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getUnsettableKeyword_34());
                    }

                    }


                    }
                    break;
                case 36 :
                    // InternalOCLinEcore.g:3506:6: ( 'volatile' )
                    {
                    // InternalOCLinEcore.g:3506:6: ( 'volatile' )
                    // InternalOCLinEcore.g:3507:1: 'volatile'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralNameAccess().getVolatileKeyword_35());
                    }
                    match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralNameAccess().getVolatileKeyword_35());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralName__Alternatives"


    // $ANTLR start "rule__InvariantConstraintCS__Alternatives_3"
    // InternalOCLinEcore.g:3519:1: rule__InvariantConstraintCS__Alternatives_3 : ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) );
    public final void rule__InvariantConstraintCS__Alternatives_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3523:1: ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) )
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==104) ) {
                alt3=1;
            }
            else if ( (LA3_0==52) ) {
                alt3=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 3, 0, input);

                throw nvae;
            }
            switch (alt3) {
                case 1 :
                    // InternalOCLinEcore.g:3524:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3524:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
                    // InternalOCLinEcore.g:3525:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getInvariantConstraintCSAccess().getGroup_3_0());
                    }
                    // InternalOCLinEcore.g:3526:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
                    // InternalOCLinEcore.g:3526:2: rule__InvariantConstraintCS__Group_3_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__InvariantConstraintCS__Group_3_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getInvariantConstraintCSAccess().getGroup_3_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3530:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3530:6: ( ';' )
                    // InternalOCLinEcore.g:3531:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Alternatives_3"


    // $ANTLR start "rule__AnnotationCS__NameAlternatives_2_0"
    // InternalOCLinEcore.g:3543:1: rule__AnnotationCS__NameAlternatives_2_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
    public final void rule__AnnotationCS__NameAlternatives_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3547:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( ((LA4_0>=RULE_SIMPLE_ID && LA4_0<=RULE_ESCAPED_ID)||(LA4_0>=17 && LA4_0<=51)||(LA4_0>=54 && LA4_0<=60)) ) {
                alt4=1;
            }
            else if ( (LA4_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt4=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 4, 0, input);

                throw nvae;
            }
            switch (alt4) {
                case 1 :
                    // InternalOCLinEcore.g:3548:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3548:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3549:1: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3554:6: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3554:6: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3555:1: RULE_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
                    }
                    match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__NameAlternatives_2_0"


    // $ANTLR start "rule__AnnotationCS__Alternatives_4"
    // InternalOCLinEcore.g:3565:1: rule__AnnotationCS__Alternatives_4 : ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) );
    public final void rule__AnnotationCS__Alternatives_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3569:1: ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) )
            int alt5=2;
            int LA5_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt5) {
                case 1 :
                    // InternalOCLinEcore.g:3570:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3570:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
                    // InternalOCLinEcore.g:3571:1: ( rule__AnnotationCS__Group_4_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getGroup_4_0());
                    }
                    // InternalOCLinEcore.g:3572:1: ( rule__AnnotationCS__Group_4_0__0 )
                    // InternalOCLinEcore.g:3572:2: rule__AnnotationCS__Group_4_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__Group_4_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getGroup_4_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3576:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3576:6: ( ';' )
                    // InternalOCLinEcore.g:3577:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getSemicolonKeyword_4_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getSemicolonKeyword_4_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Alternatives_4"


    // $ANTLR start "rule__AnnotationCS__Alternatives_4_0_1"
    // InternalOCLinEcore.g:3589:1: rule__AnnotationCS__Alternatives_4_0_1 : ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) );
    public final void rule__AnnotationCS__Alternatives_4_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3593:1: ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) )
            int alt6=3;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt6=1;
                }
                break;
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 18:
            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 45:
            case 46:
            case 47:
            case 48:
            case 49:
            case 50:
            case 51:
            case 57:
                {
                alt6=2;
                }
                break;
            case 44:
                {
                int LA6_3 = input.LA(2);

                if ( ((LA6_3>=RULE_SIMPLE_ID && LA6_3<=RULE_ESCAPED_ID)||(LA6_3>=17 && LA6_3<=51)||(LA6_3>=54 && LA6_3<=60)) ) {
                    alt6=3;
                }
                else if ( (LA6_3==52||LA6_3==71||LA6_3==104||LA6_3==106) ) {
                    alt6=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 6, 3, input);

                    throw nvae;
                }
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;
            }

            switch (alt6) {
                case 1 :
                    // InternalOCLinEcore.g:3594:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3594:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    // InternalOCLinEcore.g:3595:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }
                    // InternalOCLinEcore.g:3596:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    // InternalOCLinEcore.g:3596:2: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3600:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:3600:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
                    // InternalOCLinEcore.g:3601:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedContentsAssignment_4_0_1_1());
                    }
                    // InternalOCLinEcore.g:3602:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
                    // InternalOCLinEcore.g:3602:2: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getOwnedContentsAssignment_4_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3606:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:3606:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
                    // InternalOCLinEcore.g:3607:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedReferencesAssignment_4_0_1_2());
                    }
                    // InternalOCLinEcore.g:3608:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
                    // InternalOCLinEcore.g:3608:2: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationCSAccess().getOwnedReferencesAssignment_4_0_1_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Alternatives_4_0_1"


    // $ANTLR start "rule__AnnotationElementCS__Alternatives"
    // InternalOCLinEcore.g:3617:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) );
    public final void rule__AnnotationElementCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3621:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) )
            int alt7=3;
            switch ( input.LA(1) ) {
            case 54:
                {
                alt7=1;
                }
                break;
            case 55:
                {
                alt7=2;
                }
                break;
            case 60:
                {
                alt7=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;
            }

            switch (alt7) {
                case 1 :
                    // InternalOCLinEcore.g:3622:1: ( ruleAnnotationCS )
                    {
                    // InternalOCLinEcore.g:3622:1: ( ruleAnnotationCS )
                    // InternalOCLinEcore.g:3623:1: ruleAnnotationCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationElementCSAccess().getAnnotationCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleAnnotationCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationElementCSAccess().getAnnotationCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3628:6: ( ruleDocumentationCS )
                    {
                    // InternalOCLinEcore.g:3628:6: ( ruleDocumentationCS )
                    // InternalOCLinEcore.g:3629:1: ruleDocumentationCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationElementCSAccess().getDocumentationCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleDocumentationCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationElementCSAccess().getDocumentationCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3634:6: ( ruleSysMLCS )
                    {
                    // InternalOCLinEcore.g:3634:6: ( ruleSysMLCS )
                    // InternalOCLinEcore.g:3635:1: ruleSysMLCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationElementCSAccess().getSysMLCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleSysMLCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAnnotationElementCSAccess().getSysMLCSParserRuleCall_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationElementCS__Alternatives"


    // $ANTLR start "rule__AttributeCS__Alternatives_0"
    // InternalOCLinEcore.g:3645:1: rule__AttributeCS__Alternatives_0 : ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) );
    public final void rule__AttributeCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3649:1: ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) )
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==46) ) {
                alt8=1;
            }
            else if ( (LA8_0==24) ) {
                alt8=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;
            }
            switch (alt8) {
                case 1 :
                    // InternalOCLinEcore.g:3650:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3650:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:3651:1: ( rule__AttributeCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:3652:1: ( rule__AttributeCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:3652:2: rule__AttributeCS__Group_0_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_0_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getGroup_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3656:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:3656:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:3657:1: ( rule__AttributeCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:3658:1: ( rule__AttributeCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:3658:2: rule__AttributeCS__Group_0_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_0_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getGroup_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Alternatives_0"


    // $ANTLR start "rule__AttributeCS__Alternatives_5_1_0"
    // InternalOCLinEcore.g:3667:1: rule__AttributeCS__Alternatives_5_1_0 : ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) );
    public final void rule__AttributeCS__Alternatives_5_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3671:1: ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) )
            int alt9=16;
            switch ( input.LA(1) ) {
            case 26:
                {
                alt9=1;
                }
                break;
            case 128:
                {
                alt9=2;
                }
                break;
            case 29:
                {
                alt9=3;
                }
                break;
            case 129:
                {
                alt9=4;
                }
                break;
            case 37:
                {
                alt9=5;
                }
                break;
            case 130:
                {
                alt9=6;
                }
                break;
            case 43:
                {
                alt9=7;
                }
                break;
            case 131:
                {
                alt9=8;
                }
                break;
            case 48:
                {
                alt9=9;
                }
                break;
            case 132:
                {
                alt9=10;
                }
                break;
            case 49:
                {
                alt9=11;
                }
                break;
            case 133:
                {
                alt9=12;
                }
                break;
            case 50:
                {
                alt9=13;
                }
                break;
            case 134:
                {
                alt9=14;
                }
                break;
            case 51:
                {
                alt9=15;
                }
                break;
            case 135:
                {
                alt9=16;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 9, 0, input);

                throw nvae;
            }

            switch (alt9) {
                case 1 :
                    // InternalOCLinEcore.g:3672:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:3672:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
                    // InternalOCLinEcore.g:3673:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_0());
                    }
                    // InternalOCLinEcore.g:3674:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
                    // InternalOCLinEcore.g:3674:2: rule__AttributeCS__QualifiersAssignment_5_1_0_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3678:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:3678:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
                    // InternalOCLinEcore.g:3679:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_1());
                    }
                    // InternalOCLinEcore.g:3680:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
                    // InternalOCLinEcore.g:3680:2: rule__AttributeCS__QualifiersAssignment_5_1_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3684:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:3684:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
                    // InternalOCLinEcore.g:3685:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_2());
                    }
                    // InternalOCLinEcore.g:3686:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
                    // InternalOCLinEcore.g:3686:2: rule__AttributeCS__QualifiersAssignment_5_1_0_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:3690:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:3690:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
                    // InternalOCLinEcore.g:3691:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_3());
                    }
                    // InternalOCLinEcore.g:3692:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
                    // InternalOCLinEcore.g:3692:2: rule__AttributeCS__QualifiersAssignment_5_1_0_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:3696:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:3696:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
                    // InternalOCLinEcore.g:3697:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_4());
                    }
                    // InternalOCLinEcore.g:3698:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
                    // InternalOCLinEcore.g:3698:2: rule__AttributeCS__QualifiersAssignment_5_1_0_4
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_4();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:3702:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:3702:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
                    // InternalOCLinEcore.g:3703:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_5());
                    }
                    // InternalOCLinEcore.g:3704:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
                    // InternalOCLinEcore.g:3704:2: rule__AttributeCS__QualifiersAssignment_5_1_0_5
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_5();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:3708:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:3708:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
                    // InternalOCLinEcore.g:3709:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_6());
                    }
                    // InternalOCLinEcore.g:3710:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
                    // InternalOCLinEcore.g:3710:2: rule__AttributeCS__QualifiersAssignment_5_1_0_6
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_6();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:3714:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:3714:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
                    // InternalOCLinEcore.g:3715:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_7());
                    }
                    // InternalOCLinEcore.g:3716:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
                    // InternalOCLinEcore.g:3716:2: rule__AttributeCS__QualifiersAssignment_5_1_0_7
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_7();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:3720:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
                    {
                    // InternalOCLinEcore.g:3720:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
                    // InternalOCLinEcore.g:3721:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_8());
                    }
                    // InternalOCLinEcore.g:3722:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
                    // InternalOCLinEcore.g:3722:2: rule__AttributeCS__QualifiersAssignment_5_1_0_8
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_8();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:3726:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
                    {
                    // InternalOCLinEcore.g:3726:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
                    // InternalOCLinEcore.g:3727:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_9());
                    }
                    // InternalOCLinEcore.g:3728:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
                    // InternalOCLinEcore.g:3728:2: rule__AttributeCS__QualifiersAssignment_5_1_0_9
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_9();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_9());
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:3732:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
                    {
                    // InternalOCLinEcore.g:3732:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
                    // InternalOCLinEcore.g:3733:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_10());
                    }
                    // InternalOCLinEcore.g:3734:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
                    // InternalOCLinEcore.g:3734:2: rule__AttributeCS__QualifiersAssignment_5_1_0_10
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_10();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_10());
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:3738:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
                    {
                    // InternalOCLinEcore.g:3738:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
                    // InternalOCLinEcore.g:3739:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_11());
                    }
                    // InternalOCLinEcore.g:3740:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
                    // InternalOCLinEcore.g:3740:2: rule__AttributeCS__QualifiersAssignment_5_1_0_11
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_11();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_11());
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:3744:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
                    {
                    // InternalOCLinEcore.g:3744:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
                    // InternalOCLinEcore.g:3745:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_12());
                    }
                    // InternalOCLinEcore.g:3746:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
                    // InternalOCLinEcore.g:3746:2: rule__AttributeCS__QualifiersAssignment_5_1_0_12
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_12();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_12());
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:3750:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
                    {
                    // InternalOCLinEcore.g:3750:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
                    // InternalOCLinEcore.g:3751:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_13());
                    }
                    // InternalOCLinEcore.g:3752:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
                    // InternalOCLinEcore.g:3752:2: rule__AttributeCS__QualifiersAssignment_5_1_0_13
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_13();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_13());
                    }

                    }


                    }
                    break;
                case 15 :
                    // InternalOCLinEcore.g:3756:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
                    {
                    // InternalOCLinEcore.g:3756:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
                    // InternalOCLinEcore.g:3757:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_14());
                    }
                    // InternalOCLinEcore.g:3758:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
                    // InternalOCLinEcore.g:3758:2: rule__AttributeCS__QualifiersAssignment_5_1_0_14
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_14();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_14());
                    }

                    }


                    }
                    break;
                case 16 :
                    // InternalOCLinEcore.g:3762:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
                    {
                    // InternalOCLinEcore.g:3762:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
                    // InternalOCLinEcore.g:3763:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_15());
                    }
                    // InternalOCLinEcore.g:3764:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
                    // InternalOCLinEcore.g:3764:2: rule__AttributeCS__QualifiersAssignment_5_1_0_15
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_5_1_0_15();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_15());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Alternatives_5_1_0"


    // $ANTLR start "rule__AttributeCS__Alternatives_6"
    // InternalOCLinEcore.g:3773:1: rule__AttributeCS__Alternatives_6 : ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) );
    public final void rule__AttributeCS__Alternatives_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3777:1: ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) )
            int alt10=2;
            int LA10_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt10) {
                case 1 :
                    // InternalOCLinEcore.g:3778:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3778:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
                    // InternalOCLinEcore.g:3779:1: ( rule__AttributeCS__Group_6_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0());
                    }
                    // InternalOCLinEcore.g:3780:1: ( rule__AttributeCS__Group_6_0__0 )
                    // InternalOCLinEcore.g:3780:2: rule__AttributeCS__Group_6_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_6_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getGroup_6_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3784:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3784:6: ( ';' )
                    // InternalOCLinEcore.g:3785:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Alternatives_6"


    // $ANTLR start "rule__AttributeCS__Alternatives_6_0_1"
    // InternalOCLinEcore.g:3797:1: rule__AttributeCS__Alternatives_6_0_1 : ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) );
    public final void rule__AttributeCS__Alternatives_6_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3801:1: ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) )
            int alt11=3;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt11=1;
                }
                break;
            case 31:
                {
                alt11=2;
                }
                break;
            case 25:
                {
                alt11=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 11, 0, input);

                throw nvae;
            }

            switch (alt11) {
                case 1 :
                    // InternalOCLinEcore.g:3802:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3802:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    // InternalOCLinEcore.g:3803:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }
                    // InternalOCLinEcore.g:3804:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    // InternalOCLinEcore.g:3804:2: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3808:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:3808:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
                    // InternalOCLinEcore.g:3809:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_1());
                    }
                    // InternalOCLinEcore.g:3810:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
                    // InternalOCLinEcore.g:3810:2: rule__AttributeCS__Group_6_0_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_6_0_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3814:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:3814:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
                    // InternalOCLinEcore.g:3815:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_2());
                    }
                    // InternalOCLinEcore.g:3816:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
                    // InternalOCLinEcore.g:3816:2: rule__AttributeCS__Group_6_0_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_6_0_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Alternatives_6_0_1"


    // $ANTLR start "rule__ClassCS__Alternatives"
    // InternalOCLinEcore.g:3825:1: rule__ClassCS__Alternatives : ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) );
    public final void rule__ClassCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3829:1: ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) )
            int alt12=3;
            switch ( input.LA(1) ) {
            case 17:
            case 21:
                {
                alt12=1;
                }
                break;
            case 23:
            case 41:
                {
                alt12=2;
                }
                break;
            case 27:
                {
                alt12=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 12, 0, input);

                throw nvae;
            }

            switch (alt12) {
                case 1 :
                    // InternalOCLinEcore.g:3830:1: ( ruleStructuredClassCS )
                    {
                    // InternalOCLinEcore.g:3830:1: ( ruleStructuredClassCS )
                    // InternalOCLinEcore.g:3831:1: ruleStructuredClassCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getClassCSAccess().getStructuredClassCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleStructuredClassCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getClassCSAccess().getStructuredClassCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3836:6: ( ruleDataTypeCS )
                    {
                    // InternalOCLinEcore.g:3836:6: ( ruleDataTypeCS )
                    // InternalOCLinEcore.g:3837:1: ruleDataTypeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getClassCSAccess().getDataTypeCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleDataTypeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getClassCSAccess().getDataTypeCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:3842:6: ( ruleEnumerationCS )
                    {
                    // InternalOCLinEcore.g:3842:6: ( ruleEnumerationCS )
                    // InternalOCLinEcore.g:3843:1: ruleEnumerationCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getClassCSAccess().getEnumerationCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleEnumerationCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getClassCSAccess().getEnumerationCSParserRuleCall_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ClassCS__Alternatives"


    // $ANTLR start "rule__DataTypeCS__Alternatives_5_1"
    // InternalOCLinEcore.g:3853:1: rule__DataTypeCS__Alternatives_5_1 : ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) );
    public final void rule__DataTypeCS__Alternatives_5_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3857:1: ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) )
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==59) ) {
                alt13=1;
            }
            else if ( (LA13_0==53) ) {
                alt13=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 13, 0, input);

                throw nvae;
            }
            switch (alt13) {
                case 1 :
                    // InternalOCLinEcore.g:3858:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3858:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
                    // InternalOCLinEcore.g:3859:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getIsSerializableAssignment_5_1_0());
                    }
                    // InternalOCLinEcore.g:3860:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
                    // InternalOCLinEcore.g:3860:2: rule__DataTypeCS__IsSerializableAssignment_5_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__IsSerializableAssignment_5_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getIsSerializableAssignment_5_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3864:6: ( '!serializable' )
                    {
                    // InternalOCLinEcore.g:3864:6: ( '!serializable' )
                    // InternalOCLinEcore.g:3865:1: '!serializable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());
                    }
                    match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Alternatives_5_1"


    // $ANTLR start "rule__DataTypeCS__Alternatives_6"
    // InternalOCLinEcore.g:3877:1: rule__DataTypeCS__Alternatives_6 : ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) );
    public final void rule__DataTypeCS__Alternatives_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3881:1: ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) )
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==106) ) {
                alt14=1;
            }
            else if ( (LA14_0==52) ) {
                alt14=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 14, 0, input);

                throw nvae;
            }
            switch (alt14) {
                case 1 :
                    // InternalOCLinEcore.g:3882:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3882:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
                    // InternalOCLinEcore.g:3883:1: ( rule__DataTypeCS__Group_6_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getGroup_6_0());
                    }
                    // InternalOCLinEcore.g:3884:1: ( rule__DataTypeCS__Group_6_0__0 )
                    // InternalOCLinEcore.g:3884:2: rule__DataTypeCS__Group_6_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__Group_6_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getGroup_6_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3888:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3888:6: ( ';' )
                    // InternalOCLinEcore.g:3889:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getSemicolonKeyword_6_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getSemicolonKeyword_6_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Alternatives_6"


    // $ANTLR start "rule__DataTypeCS__Alternatives_6_0_1"
    // InternalOCLinEcore.g:3901:1: rule__DataTypeCS__Alternatives_6_0_1 : ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) );
    public final void rule__DataTypeCS__Alternatives_6_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3905:1: ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) )
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( ((LA15_0>=54 && LA15_0<=55)||LA15_0==60) ) {
                alt15=1;
            }
            else if ( (LA15_0==20||LA15_0==56) ) {
                alt15=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 15, 0, input);

                throw nvae;
            }
            switch (alt15) {
                case 1 :
                    // InternalOCLinEcore.g:3906:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3906:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    // InternalOCLinEcore.g:3907:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }
                    // InternalOCLinEcore.g:3908:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    // InternalOCLinEcore.g:3908:2: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3912:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:3912:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
                    // InternalOCLinEcore.g:3913:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsAssignment_6_0_1_1());
                    }
                    // InternalOCLinEcore.g:3914:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
                    // InternalOCLinEcore.g:3914:2: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsAssignment_6_0_1_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Alternatives_6_0_1"


    // $ANTLR start "rule__DetailCS__NameAlternatives_0_0"
    // InternalOCLinEcore.g:3923:1: rule__DetailCS__NameAlternatives_0_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
    public final void rule__DetailCS__NameAlternatives_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3927:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( ((LA16_0>=RULE_SIMPLE_ID && LA16_0<=RULE_ESCAPED_ID)||(LA16_0>=17 && LA16_0<=51)||(LA16_0>=54 && LA16_0<=60)) ) {
                alt16=1;
            }
            else if ( (LA16_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt16=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 16, 0, input);

                throw nvae;
            }
            switch (alt16) {
                case 1 :
                    // InternalOCLinEcore.g:3928:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3928:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3929:1: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDetailCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDetailCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3934:6: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3934:6: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3935:1: RULE_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDetailCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_0_0_1());
                    }
                    match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDetailCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_0_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__NameAlternatives_0_0"


    // $ANTLR start "rule__DetailCS__ValuesAlternatives_2_0"
    // InternalOCLinEcore.g:3945:1: rule__DetailCS__ValuesAlternatives_2_0 : ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) );
    public final void rule__DetailCS__ValuesAlternatives_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3949:1: ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) )
            int alt17=2;
            int LA17_0 = input.LA(1);

            if ( (LA17_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt17=1;
            }
            else if ( (LA17_0==RULE_ML_SINGLE_QUOTED_STRING) ) {
                alt17=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 17, 0, input);

                throw nvae;
            }
            switch (alt17) {
                case 1 :
                    // InternalOCLinEcore.g:3950:1: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3950:1: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3951:1: RULE_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDetailCSAccess().getValuesSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_0());
                    }
                    match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDetailCSAccess().getValuesSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3956:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3956:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3957:1: RULE_ML_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDetailCSAccess().getValuesML_SINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
                    }
                    match(input,RULE_ML_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getDetailCSAccess().getValuesML_SINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__ValuesAlternatives_2_0"


    // $ANTLR start "rule__EnumerationCS__Alternatives_4_1"
    // InternalOCLinEcore.g:3967:1: rule__EnumerationCS__Alternatives_4_1 : ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) );
    public final void rule__EnumerationCS__Alternatives_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3971:1: ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) )
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==59) ) {
                alt18=1;
            }
            else if ( (LA18_0==53) ) {
                alt18=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 18, 0, input);

                throw nvae;
            }
            switch (alt18) {
                case 1 :
                    // InternalOCLinEcore.g:3972:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3972:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
                    // InternalOCLinEcore.g:3973:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getIsSerializableAssignment_4_1_0());
                    }
                    // InternalOCLinEcore.g:3974:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
                    // InternalOCLinEcore.g:3974:2: rule__EnumerationCS__IsSerializableAssignment_4_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__IsSerializableAssignment_4_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getIsSerializableAssignment_4_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3978:6: ( '!serializable' )
                    {
                    // InternalOCLinEcore.g:3978:6: ( '!serializable' )
                    // InternalOCLinEcore.g:3979:1: '!serializable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());
                    }
                    match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Alternatives_4_1"


    // $ANTLR start "rule__EnumerationCS__Alternatives_5"
    // InternalOCLinEcore.g:3991:1: rule__EnumerationCS__Alternatives_5 : ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) );
    public final void rule__EnumerationCS__Alternatives_5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3995:1: ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) )
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==106) ) {
                alt19=1;
            }
            else if ( (LA19_0==52) ) {
                alt19=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 19, 0, input);

                throw nvae;
            }
            switch (alt19) {
                case 1 :
                    // InternalOCLinEcore.g:3996:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3996:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
                    // InternalOCLinEcore.g:3997:1: ( rule__EnumerationCS__Group_5_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getGroup_5_0());
                    }
                    // InternalOCLinEcore.g:3998:1: ( rule__EnumerationCS__Group_5_0__0 )
                    // InternalOCLinEcore.g:3998:2: rule__EnumerationCS__Group_5_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__Group_5_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getGroup_5_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4002:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4002:6: ( ';' )
                    // InternalOCLinEcore.g:4003:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getSemicolonKeyword_5_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getSemicolonKeyword_5_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Alternatives_5"


    // $ANTLR start "rule__EnumerationCS__Alternatives_5_0_1"
    // InternalOCLinEcore.g:4015:1: rule__EnumerationCS__Alternatives_5_0_1 : ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) );
    public final void rule__EnumerationCS__Alternatives_5_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4019:1: ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) )
            int alt20=3;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt20=1;
                }
                break;
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 18:
            case 19:
            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 57:
                {
                alt20=2;
                }
                break;
            case 20:
                {
                int LA20_3 = input.LA(2);

                if ( (LA20_3==52||LA20_3==71||LA20_3==104||LA20_3==106) ) {
                    alt20=2;
                }
                else if ( (LA20_3==56) ) {
                    alt20=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 20, 3, input);

                    throw nvae;
                }
                }
                break;
            case 56:
                {
                alt20=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 20, 0, input);

                throw nvae;
            }

            switch (alt20) {
                case 1 :
                    // InternalOCLinEcore.g:4020:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4020:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
                    // InternalOCLinEcore.g:4021:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAssignment_5_0_1_0());
                    }
                    // InternalOCLinEcore.g:4022:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
                    // InternalOCLinEcore.g:4022:2: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAssignment_5_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4026:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4026:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
                    // InternalOCLinEcore.g:4027:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsAssignment_5_0_1_1());
                    }
                    // InternalOCLinEcore.g:4028:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
                    // InternalOCLinEcore.g:4028:2: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsAssignment_5_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4032:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:4032:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
                    // InternalOCLinEcore.g:4033:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsAssignment_5_0_1_2());
                    }
                    // InternalOCLinEcore.g:4034:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
                    // InternalOCLinEcore.g:4034:2: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsAssignment_5_0_1_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Alternatives_5_0_1"


    // $ANTLR start "rule__EnumerationLiteralCS__Alternatives_0"
    // InternalOCLinEcore.g:4043:1: rule__EnumerationLiteralCS__Alternatives_0 : ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) );
    public final void rule__EnumerationLiteralCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4047:1: ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) )
            int alt21=2;
            int LA21_0 = input.LA(1);

            if ( (LA21_0==57) ) {
                alt21=1;
            }
            else if ( ((LA21_0>=RULE_SIMPLE_ID && LA21_0<=RULE_ESCAPED_ID)||(LA21_0>=17 && LA21_0<=51)) ) {
                alt21=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 21, 0, input);

                throw nvae;
            }
            switch (alt21) {
                case 1 :
                    // InternalOCLinEcore.g:4048:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4048:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:4049:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:4050:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:4050:2: rule__EnumerationLiteralCS__Group_0_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__Group_0_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralCSAccess().getGroup_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4054:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4054:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
                    // InternalOCLinEcore.g:4055:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_1());
                    }
                    // InternalOCLinEcore.g:4056:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
                    // InternalOCLinEcore.g:4056:2: rule__EnumerationLiteralCS__NameAssignment_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__NameAssignment_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Alternatives_0"


    // $ANTLR start "rule__EnumerationLiteralCS__Alternatives_3"
    // InternalOCLinEcore.g:4065:1: rule__EnumerationLiteralCS__Alternatives_3 : ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) );
    public final void rule__EnumerationLiteralCS__Alternatives_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4069:1: ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) )
            int alt22=2;
            int LA22_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt22) {
                case 1 :
                    // InternalOCLinEcore.g:4070:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4070:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
                    // InternalOCLinEcore.g:4071:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_3_0());
                    }
                    // InternalOCLinEcore.g:4072:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
                    // InternalOCLinEcore.g:4072:2: rule__EnumerationLiteralCS__Group_3_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__Group_3_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralCSAccess().getGroup_3_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4076:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4076:6: ( ';' )
                    // InternalOCLinEcore.g:4077:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_3_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_3_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Alternatives_3"


    // $ANTLR start "rule__ImportCS__Alternatives_0"
    // InternalOCLinEcore.g:4089:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'library' ) );
    public final void rule__ImportCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4093:1: ( ( 'import' ) | ( 'library' ) )
            int alt23=2;
            int LA23_0 = input.LA(1);

            if ( (LA23_0==30) ) {
                alt23=1;
            }
            else if ( (LA23_0==34) ) {
                alt23=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 23, 0, input);

                throw nvae;
            }
            switch (alt23) {
                case 1 :
                    // InternalOCLinEcore.g:4094:1: ( 'import' )
                    {
                    // InternalOCLinEcore.g:4094:1: ( 'import' )
                    // InternalOCLinEcore.g:4095:1: 'import'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImportCSAccess().getImportKeyword_0_0());
                    }
                    match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImportCSAccess().getImportKeyword_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4102:6: ( 'library' )
                    {
                    // InternalOCLinEcore.g:4102:6: ( 'library' )
                    // InternalOCLinEcore.g:4103:1: 'library'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImportCSAccess().getLibraryKeyword_0_1());
                    }
                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImportCSAccess().getLibraryKeyword_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Alternatives_0"


    // $ANTLR start "rule__ModelElementCS__Alternatives"
    // InternalOCLinEcore.g:4115:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );
    public final void rule__ModelElementCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4119:1: ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) )
            int alt24=5;
            alt24 = dfa24.predict(input);
            switch (alt24) {
                case 1 :
                    // InternalOCLinEcore.g:4120:1: ( ruleClassCS )
                    {
                    // InternalOCLinEcore.g:4120:1: ( ruleClassCS )
                    // InternalOCLinEcore.g:4121:1: ruleClassCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getModelElementCSAccess().getClassCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleClassCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getModelElementCSAccess().getClassCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4126:6: ( ruleEnumerationLiteralCS )
                    {
                    // InternalOCLinEcore.g:4126:6: ( ruleEnumerationLiteralCS )
                    // InternalOCLinEcore.g:4127:1: ruleEnumerationLiteralCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getModelElementCSAccess().getEnumerationLiteralCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleEnumerationLiteralCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getModelElementCSAccess().getEnumerationLiteralCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4132:6: ( ruleOperationCS )
                    {
                    // InternalOCLinEcore.g:4132:6: ( ruleOperationCS )
                    // InternalOCLinEcore.g:4133:1: ruleOperationCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getModelElementCSAccess().getOperationCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleOperationCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getModelElementCSAccess().getOperationCSParserRuleCall_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4138:6: ( rulePackageCS )
                    {
                    // InternalOCLinEcore.g:4138:6: ( rulePackageCS )
                    // InternalOCLinEcore.g:4139:1: rulePackageCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getModelElementCSAccess().getPackageCSParserRuleCall_3());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePackageCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getModelElementCSAccess().getPackageCSParserRuleCall_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4144:6: ( ruleStructuralFeatureCS )
                    {
                    // InternalOCLinEcore.g:4144:6: ( ruleStructuralFeatureCS )
                    // InternalOCLinEcore.g:4145:1: ruleStructuralFeatureCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getModelElementCSAccess().getStructuralFeatureCSParserRuleCall_4());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleStructuralFeatureCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getModelElementCSAccess().getStructuralFeatureCSParserRuleCall_4());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementCS__Alternatives"


    // $ANTLR start "rule__OperationCS__Alternatives_0"
    // InternalOCLinEcore.g:4155:1: rule__OperationCS__Alternatives_0 : ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) );
    public final void rule__OperationCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4159:1: ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) )
            int alt25=2;
            int LA25_0 = input.LA(1);

            if ( (LA25_0==46) ) {
                alt25=1;
            }
            else if ( (LA25_0==24) ) {
                alt25=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 25, 0, input);

                throw nvae;
            }
            switch (alt25) {
                case 1 :
                    // InternalOCLinEcore.g:4160:1: ( ( rule__OperationCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4160:1: ( ( rule__OperationCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:4161:1: ( rule__OperationCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:4162:1: ( rule__OperationCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:4162:2: rule__OperationCS__Group_0_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_0_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getGroup_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4166:6: ( ( rule__OperationCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4166:6: ( ( rule__OperationCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:4167:1: ( rule__OperationCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:4168:1: ( rule__OperationCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:4168:2: rule__OperationCS__Group_0_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_0_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getGroup_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Alternatives_0"


    // $ANTLR start "rule__OperationCS__Alternatives_9_1_0"
    // InternalOCLinEcore.g:4177:1: rule__OperationCS__Alternatives_9_1_0 : ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) );
    public final void rule__OperationCS__Alternatives_9_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4181:1: ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) )
            int alt26=8;
            switch ( input.LA(1) ) {
            case 26:
                {
                alt26=1;
                }
                break;
            case 128:
                {
                alt26=2;
                }
                break;
            case 37:
                {
                alt26=3;
                }
                break;
            case 130:
                {
                alt26=4;
                }
                break;
            case 48:
                {
                alt26=5;
                }
                break;
            case 132:
                {
                alt26=6;
                }
                break;
            case 49:
                {
                alt26=7;
                }
                break;
            case 133:
                {
                alt26=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 26, 0, input);

                throw nvae;
            }

            switch (alt26) {
                case 1 :
                    // InternalOCLinEcore.g:4182:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4182:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
                    // InternalOCLinEcore.g:4183:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_0());
                    }
                    // InternalOCLinEcore.g:4184:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
                    // InternalOCLinEcore.g:4184:2: rule__OperationCS__QualifiersAssignment_9_1_0_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4188:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4188:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
                    // InternalOCLinEcore.g:4189:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_1());
                    }
                    // InternalOCLinEcore.g:4190:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
                    // InternalOCLinEcore.g:4190:2: rule__OperationCS__QualifiersAssignment_9_1_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4194:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4194:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
                    // InternalOCLinEcore.g:4195:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_2());
                    }
                    // InternalOCLinEcore.g:4196:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
                    // InternalOCLinEcore.g:4196:2: rule__OperationCS__QualifiersAssignment_9_1_0_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4200:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4200:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
                    // InternalOCLinEcore.g:4201:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_3());
                    }
                    // InternalOCLinEcore.g:4202:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
                    // InternalOCLinEcore.g:4202:2: rule__OperationCS__QualifiersAssignment_9_1_0_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4206:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:4206:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
                    // InternalOCLinEcore.g:4207:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_4());
                    }
                    // InternalOCLinEcore.g:4208:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
                    // InternalOCLinEcore.g:4208:2: rule__OperationCS__QualifiersAssignment_9_1_0_4
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_4();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4212:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:4212:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
                    // InternalOCLinEcore.g:4213:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_5());
                    }
                    // InternalOCLinEcore.g:4214:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
                    // InternalOCLinEcore.g:4214:2: rule__OperationCS__QualifiersAssignment_9_1_0_5
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_5();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4218:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:4218:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
                    // InternalOCLinEcore.g:4219:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_6());
                    }
                    // InternalOCLinEcore.g:4220:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
                    // InternalOCLinEcore.g:4220:2: rule__OperationCS__QualifiersAssignment_9_1_0_6
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_6();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4224:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:4224:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
                    // InternalOCLinEcore.g:4225:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_7());
                    }
                    // InternalOCLinEcore.g:4226:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
                    // InternalOCLinEcore.g:4226:2: rule__OperationCS__QualifiersAssignment_9_1_0_7
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_9_1_0_7();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_7());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Alternatives_9_1_0"


    // $ANTLR start "rule__OperationCS__Alternatives_10"
    // InternalOCLinEcore.g:4235:1: rule__OperationCS__Alternatives_10 : ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) );
    public final void rule__OperationCS__Alternatives_10() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4239:1: ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) )
            int alt27=2;
            int LA27_0 = input.LA(1);

            if ( (LA27_0==106) ) {
                alt27=1;
            }
            else if ( (LA27_0==52) ) {
                alt27=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 27, 0, input);

                throw nvae;
            }
            switch (alt27) {
                case 1 :
                    // InternalOCLinEcore.g:4240:1: ( ( rule__OperationCS__Group_10_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4240:1: ( ( rule__OperationCS__Group_10_0__0 ) )
                    // InternalOCLinEcore.g:4241:1: ( rule__OperationCS__Group_10_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_10_0());
                    }
                    // InternalOCLinEcore.g:4242:1: ( rule__OperationCS__Group_10_0__0 )
                    // InternalOCLinEcore.g:4242:2: rule__OperationCS__Group_10_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_10_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getGroup_10_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4246:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4246:6: ( ';' )
                    // InternalOCLinEcore.g:4247:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Alternatives_10"


    // $ANTLR start "rule__OperationCS__Alternatives_10_0_1"
    // InternalOCLinEcore.g:4259:1: rule__OperationCS__Alternatives_10_0_1 : ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) );
    public final void rule__OperationCS__Alternatives_10_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4263:1: ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) )
            int alt28=4;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt28=1;
                }
                break;
            case 40:
                {
                alt28=2;
                }
                break;
            case 19:
                {
                alt28=3;
                }
                break;
            case 39:
                {
                alt28=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 28, 0, input);

                throw nvae;
            }

            switch (alt28) {
                case 1 :
                    // InternalOCLinEcore.g:4264:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4264:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
                    // InternalOCLinEcore.g:4265:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAssignment_10_0_1_0());
                    }
                    // InternalOCLinEcore.g:4266:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
                    // InternalOCLinEcore.g:4266:2: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAssignment_10_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4270:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4270:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
                    // InternalOCLinEcore.g:4271:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedPreconditionsAssignment_10_0_1_1());
                    }
                    // InternalOCLinEcore.g:4272:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
                    // InternalOCLinEcore.g:4272:2: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getOwnedPreconditionsAssignment_10_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4276:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:4276:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
                    // InternalOCLinEcore.g:4277:1: ( rule__OperationCS__Group_10_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_10_0_1_2());
                    }
                    // InternalOCLinEcore.g:4278:1: ( rule__OperationCS__Group_10_0_1_2__0 )
                    // InternalOCLinEcore.g:4278:2: rule__OperationCS__Group_10_0_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_10_0_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getGroup_10_0_1_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4282:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
                    {
                    // InternalOCLinEcore.g:4282:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
                    // InternalOCLinEcore.g:4283:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedPostconditionsAssignment_10_0_1_3());
                    }
                    // InternalOCLinEcore.g:4284:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
                    // InternalOCLinEcore.g:4284:2: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOperationCSAccess().getOwnedPostconditionsAssignment_10_0_1_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Alternatives_10_0_1"


    // $ANTLR start "rule__PackageCS__Alternatives_4"
    // InternalOCLinEcore.g:4293:1: rule__PackageCS__Alternatives_4 : ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) );
    public final void rule__PackageCS__Alternatives_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4297:1: ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) )
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==106) ) {
                alt29=1;
            }
            else if ( (LA29_0==52) ) {
                alt29=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 29, 0, input);

                throw nvae;
            }
            switch (alt29) {
                case 1 :
                    // InternalOCLinEcore.g:4298:1: ( ( rule__PackageCS__Group_4_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4298:1: ( ( rule__PackageCS__Group_4_0__0 ) )
                    // InternalOCLinEcore.g:4299:1: ( rule__PackageCS__Group_4_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getGroup_4_0());
                    }
                    // InternalOCLinEcore.g:4300:1: ( rule__PackageCS__Group_4_0__0 )
                    // InternalOCLinEcore.g:4300:2: rule__PackageCS__Group_4_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__Group_4_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPackageCSAccess().getGroup_4_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4304:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4304:6: ( ';' )
                    // InternalOCLinEcore.g:4305:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getSemicolonKeyword_4_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPackageCSAccess().getSemicolonKeyword_4_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Alternatives_4"


    // $ANTLR start "rule__PackageCS__Alternatives_4_0_1"
    // InternalOCLinEcore.g:4317:1: rule__PackageCS__Alternatives_4_0_1 : ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) );
    public final void rule__PackageCS__Alternatives_4_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4321:1: ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) )
            int alt30=3;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt30=1;
                }
                break;
            case 38:
                {
                alt30=2;
                }
                break;
            case 17:
            case 21:
            case 23:
            case 27:
            case 41:
                {
                alt30=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 30, 0, input);

                throw nvae;
            }

            switch (alt30) {
                case 1 :
                    // InternalOCLinEcore.g:4322:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4322:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    // InternalOCLinEcore.g:4323:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }
                    // InternalOCLinEcore.g:4324:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    // InternalOCLinEcore.g:4324:2: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4328:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4328:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
                    // InternalOCLinEcore.g:4329:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedPackagesAssignment_4_0_1_1());
                    }
                    // InternalOCLinEcore.g:4330:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
                    // InternalOCLinEcore.g:4330:2: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__OwnedPackagesAssignment_4_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPackageCSAccess().getOwnedPackagesAssignment_4_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4334:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:4334:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
                    // InternalOCLinEcore.g:4335:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedClassesAssignment_4_0_1_2());
                    }
                    // InternalOCLinEcore.g:4336:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
                    // InternalOCLinEcore.g:4336:2: rule__PackageCS__OwnedClassesAssignment_4_0_1_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__OwnedClassesAssignment_4_0_1_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPackageCSAccess().getOwnedClassesAssignment_4_0_1_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Alternatives_4_0_1"


    // $ANTLR start "rule__ParameterCS__Alternatives_2_1_0"
    // InternalOCLinEcore.g:4345:1: rule__ParameterCS__Alternatives_2_1_0 : ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) );
    public final void rule__ParameterCS__Alternatives_2_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4349:1: ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) )
            int alt31=4;
            switch ( input.LA(1) ) {
            case 37:
                {
                alt31=1;
                }
                break;
            case 130:
                {
                alt31=2;
                }
                break;
            case 49:
                {
                alt31=3;
                }
                break;
            case 133:
                {
                alt31=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 31, 0, input);

                throw nvae;
            }

            switch (alt31) {
                case 1 :
                    // InternalOCLinEcore.g:4350:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4350:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
                    // InternalOCLinEcore.g:4351:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_0());
                    }
                    // InternalOCLinEcore.g:4352:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
                    // InternalOCLinEcore.g:4352:2: rule__ParameterCS__QualifiersAssignment_2_1_0_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__QualifiersAssignment_2_1_0_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4356:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4356:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
                    // InternalOCLinEcore.g:4357:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_1());
                    }
                    // InternalOCLinEcore.g:4358:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
                    // InternalOCLinEcore.g:4358:2: rule__ParameterCS__QualifiersAssignment_2_1_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__QualifiersAssignment_2_1_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4362:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4362:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
                    // InternalOCLinEcore.g:4363:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_2());
                    }
                    // InternalOCLinEcore.g:4364:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
                    // InternalOCLinEcore.g:4364:2: rule__ParameterCS__QualifiersAssignment_2_1_0_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__QualifiersAssignment_2_1_0_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4368:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4368:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
                    // InternalOCLinEcore.g:4369:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_3());
                    }
                    // InternalOCLinEcore.g:4370:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
                    // InternalOCLinEcore.g:4370:2: rule__ParameterCS__QualifiersAssignment_2_1_0_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__QualifiersAssignment_2_1_0_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Alternatives_2_1_0"


    // $ANTLR start "rule__ImplicitOppositeCS__Alternatives_4_1_0"
    // InternalOCLinEcore.g:4379:1: rule__ImplicitOppositeCS__Alternatives_4_1_0 : ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) );
    public final void rule__ImplicitOppositeCS__Alternatives_4_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4383:1: ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) )
            int alt32=4;
            switch ( input.LA(1) ) {
            case 37:
                {
                alt32=1;
                }
                break;
            case 130:
                {
                alt32=2;
                }
                break;
            case 49:
                {
                alt32=3;
                }
                break;
            case 133:
                {
                alt32=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 32, 0, input);

                throw nvae;
            }

            switch (alt32) {
                case 1 :
                    // InternalOCLinEcore.g:4384:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4384:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
                    // InternalOCLinEcore.g:4385:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_0());
                    }
                    // InternalOCLinEcore.g:4386:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
                    // InternalOCLinEcore.g:4386:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4390:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4390:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
                    // InternalOCLinEcore.g:4391:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_1());
                    }
                    // InternalOCLinEcore.g:4392:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
                    // InternalOCLinEcore.g:4392:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4396:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4396:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
                    // InternalOCLinEcore.g:4397:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_2());
                    }
                    // InternalOCLinEcore.g:4398:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
                    // InternalOCLinEcore.g:4398:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4402:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4402:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
                    // InternalOCLinEcore.g:4403:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_3());
                    }
                    // InternalOCLinEcore.g:4404:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
                    // InternalOCLinEcore.g:4404:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Alternatives_4_1_0"


    // $ANTLR start "rule__ReferenceCS__Alternatives_0"
    // InternalOCLinEcore.g:4413:1: rule__ReferenceCS__Alternatives_0 : ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) );
    public final void rule__ReferenceCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4417:1: ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) )
            int alt33=2;
            int LA33_0 = input.LA(1);

            if ( (LA33_0==46) ) {
                alt33=1;
            }
            else if ( (LA33_0==24) ) {
                alt33=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 33, 0, input);

                throw nvae;
            }
            switch (alt33) {
                case 1 :
                    // InternalOCLinEcore.g:4418:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4418:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:4419:1: ( rule__ReferenceCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:4420:1: ( rule__ReferenceCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:4420:2: rule__ReferenceCS__Group_0_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_0_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4424:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4424:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:4425:1: ( rule__ReferenceCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:4426:1: ( rule__ReferenceCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:4426:2: rule__ReferenceCS__Group_0_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_0_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Alternatives_0"


    // $ANTLR start "rule__ReferenceCS__Alternatives_6_1_0"
    // InternalOCLinEcore.g:4435:1: rule__ReferenceCS__Alternatives_6_1_0 : ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) );
    public final void rule__ReferenceCS__Alternatives_6_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4439:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) )
            int alt34=18;
            switch ( input.LA(1) ) {
            case 22:
                {
                alt34=1;
                }
                break;
            case 137:
                {
                alt34=2;
                }
                break;
            case 26:
                {
                alt34=3;
                }
                break;
            case 128:
                {
                alt34=4;
                }
                break;
            case 37:
                {
                alt34=5;
                }
                break;
            case 130:
                {
                alt34=6;
                }
                break;
            case 43:
                {
                alt34=7;
                }
                break;
            case 131:
                {
                alt34=8;
                }
                break;
            case 45:
                {
                alt34=9;
                }
                break;
            case 138:
                {
                alt34=10;
                }
                break;
            case 48:
                {
                alt34=11;
                }
                break;
            case 132:
                {
                alt34=12;
                }
                break;
            case 49:
                {
                alt34=13;
                }
                break;
            case 133:
                {
                alt34=14;
                }
                break;
            case 50:
                {
                alt34=15;
                }
                break;
            case 134:
                {
                alt34=16;
                }
                break;
            case 51:
                {
                alt34=17;
                }
                break;
            case 135:
                {
                alt34=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;
            }

            switch (alt34) {
                case 1 :
                    // InternalOCLinEcore.g:4440:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4440:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
                    // InternalOCLinEcore.g:4441:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_0());
                    }
                    // InternalOCLinEcore.g:4442:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
                    // InternalOCLinEcore.g:4442:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4446:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4446:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
                    // InternalOCLinEcore.g:4447:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_1());
                    }
                    // InternalOCLinEcore.g:4448:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
                    // InternalOCLinEcore.g:4448:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4452:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4452:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
                    // InternalOCLinEcore.g:4453:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_2());
                    }
                    // InternalOCLinEcore.g:4454:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
                    // InternalOCLinEcore.g:4454:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4458:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4458:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
                    // InternalOCLinEcore.g:4459:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_3());
                    }
                    // InternalOCLinEcore.g:4460:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
                    // InternalOCLinEcore.g:4460:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4464:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:4464:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
                    // InternalOCLinEcore.g:4465:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_4());
                    }
                    // InternalOCLinEcore.g:4466:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
                    // InternalOCLinEcore.g:4466:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_4
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_4();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4470:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:4470:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
                    // InternalOCLinEcore.g:4471:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_5());
                    }
                    // InternalOCLinEcore.g:4472:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
                    // InternalOCLinEcore.g:4472:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_5
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_5();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4476:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:4476:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
                    // InternalOCLinEcore.g:4477:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_6());
                    }
                    // InternalOCLinEcore.g:4478:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
                    // InternalOCLinEcore.g:4478:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_6
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_6();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4482:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:4482:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
                    // InternalOCLinEcore.g:4483:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_7());
                    }
                    // InternalOCLinEcore.g:4484:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
                    // InternalOCLinEcore.g:4484:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_7
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_7();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:4488:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
                    {
                    // InternalOCLinEcore.g:4488:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
                    // InternalOCLinEcore.g:4489:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_8());
                    }
                    // InternalOCLinEcore.g:4490:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
                    // InternalOCLinEcore.g:4490:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_8
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_8();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:4494:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
                    {
                    // InternalOCLinEcore.g:4494:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
                    // InternalOCLinEcore.g:4495:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_9());
                    }
                    // InternalOCLinEcore.g:4496:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
                    // InternalOCLinEcore.g:4496:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_9
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_9();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_9());
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:4500:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
                    {
                    // InternalOCLinEcore.g:4500:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
                    // InternalOCLinEcore.g:4501:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_10());
                    }
                    // InternalOCLinEcore.g:4502:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
                    // InternalOCLinEcore.g:4502:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_10
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_10();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_10());
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:4506:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
                    {
                    // InternalOCLinEcore.g:4506:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
                    // InternalOCLinEcore.g:4507:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_11());
                    }
                    // InternalOCLinEcore.g:4508:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
                    // InternalOCLinEcore.g:4508:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_11
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_11();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_11());
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:4512:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
                    {
                    // InternalOCLinEcore.g:4512:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
                    // InternalOCLinEcore.g:4513:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_12());
                    }
                    // InternalOCLinEcore.g:4514:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
                    // InternalOCLinEcore.g:4514:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_12
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_12();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_12());
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:4518:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
                    {
                    // InternalOCLinEcore.g:4518:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
                    // InternalOCLinEcore.g:4519:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_13());
                    }
                    // InternalOCLinEcore.g:4520:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
                    // InternalOCLinEcore.g:4520:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_13
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_13();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_13());
                    }

                    }


                    }
                    break;
                case 15 :
                    // InternalOCLinEcore.g:4524:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
                    {
                    // InternalOCLinEcore.g:4524:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
                    // InternalOCLinEcore.g:4525:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_14());
                    }
                    // InternalOCLinEcore.g:4526:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
                    // InternalOCLinEcore.g:4526:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_14
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_14();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_14());
                    }

                    }


                    }
                    break;
                case 16 :
                    // InternalOCLinEcore.g:4530:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
                    {
                    // InternalOCLinEcore.g:4530:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
                    // InternalOCLinEcore.g:4531:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_15());
                    }
                    // InternalOCLinEcore.g:4532:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
                    // InternalOCLinEcore.g:4532:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_15
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_15();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_15());
                    }

                    }


                    }
                    break;
                case 17 :
                    // InternalOCLinEcore.g:4536:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
                    {
                    // InternalOCLinEcore.g:4536:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
                    // InternalOCLinEcore.g:4537:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_16());
                    }
                    // InternalOCLinEcore.g:4538:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
                    // InternalOCLinEcore.g:4538:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_16
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_16();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_16());
                    }

                    }


                    }
                    break;
                case 18 :
                    // InternalOCLinEcore.g:4542:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
                    {
                    // InternalOCLinEcore.g:4542:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
                    // InternalOCLinEcore.g:4543:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_17());
                    }
                    // InternalOCLinEcore.g:4544:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
                    // InternalOCLinEcore.g:4544:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_17
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_6_1_0_17();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_17());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Alternatives_6_1_0"


    // $ANTLR start "rule__ReferenceCS__Alternatives_7"
    // InternalOCLinEcore.g:4553:1: rule__ReferenceCS__Alternatives_7 : ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) );
    public final void rule__ReferenceCS__Alternatives_7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4557:1: ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) )
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==106) ) {
                alt35=1;
            }
            else if ( (LA35_0==52) ) {
                alt35=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 35, 0, input);

                throw nvae;
            }
            switch (alt35) {
                case 1 :
                    // InternalOCLinEcore.g:4558:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4558:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
                    // InternalOCLinEcore.g:4559:1: ( rule__ReferenceCS__Group_7_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0());
                    }
                    // InternalOCLinEcore.g:4560:1: ( rule__ReferenceCS__Group_7_0__0 )
                    // InternalOCLinEcore.g:4560:2: rule__ReferenceCS__Group_7_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_7_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_7_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4564:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4564:6: ( ';' )
                    // InternalOCLinEcore.g:4565:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Alternatives_7"


    // $ANTLR start "rule__ReferenceCS__Alternatives_7_0_1"
    // InternalOCLinEcore.g:4577:1: rule__ReferenceCS__Alternatives_7_0_1 : ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) );
    public final void rule__ReferenceCS__Alternatives_7_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4581:1: ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) )
            int alt36=5;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt36=1;
                }
                break;
            case 33:
                {
                alt36=2;
                }
                break;
            case 31:
                {
                alt36=3;
                }
                break;
            case 25:
                {
                alt36=4;
                }
                break;
            case 58:
                {
                alt36=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 36, 0, input);

                throw nvae;
            }

            switch (alt36) {
                case 1 :
                    // InternalOCLinEcore.g:4582:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4582:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    // InternalOCLinEcore.g:4583:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }
                    // InternalOCLinEcore.g:4584:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    // InternalOCLinEcore.g:4584:2: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4588:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4588:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
                    // InternalOCLinEcore.g:4589:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1());
                    }
                    // InternalOCLinEcore.g:4590:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
                    // InternalOCLinEcore.g:4590:2: rule__ReferenceCS__Group_7_0_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_7_0_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4594:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:4594:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
                    // InternalOCLinEcore.g:4595:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_2());
                    }
                    // InternalOCLinEcore.g:4596:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
                    // InternalOCLinEcore.g:4596:2: rule__ReferenceCS__Group_7_0_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_7_0_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4600:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
                    {
                    // InternalOCLinEcore.g:4600:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
                    // InternalOCLinEcore.g:4601:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_3());
                    }
                    // InternalOCLinEcore.g:4602:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
                    // InternalOCLinEcore.g:4602:2: rule__ReferenceCS__Group_7_0_1_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_7_0_1_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4606:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
                    {
                    // InternalOCLinEcore.g:4606:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
                    // InternalOCLinEcore.g:4607:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_4());
                    }
                    // InternalOCLinEcore.g:4608:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
                    // InternalOCLinEcore.g:4608:2: rule__ReferenceCS__Group_7_0_1_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_7_0_1_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_4());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Alternatives_7_0_1"


    // $ANTLR start "rule__SpecificationCS__Alternatives"
    // InternalOCLinEcore.g:4617:1: rule__SpecificationCS__Alternatives : ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) );
    public final void rule__SpecificationCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4621:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( ((LA37_0>=RULE_INT && LA37_0<=RULE_SINGLE_QUOTED_STRING)||(LA37_0>=RULE_SIMPLE_ID && LA37_0<=RULE_ESCAPED_ID)||(LA37_0>=17 && LA37_0<=51)||(LA37_0>=54 && LA37_0<=64)||(LA37_0>=85 && LA37_0<=99)||LA37_0==102||LA37_0==112||(LA37_0>=114 && LA37_0<=115)||LA37_0==120||(LA37_0>=125 && LA37_0<=126)||(LA37_0>=139 && LA37_0<=140)) ) {
                alt37=1;
            }
            else if ( (LA37_0==RULE_UNQUOTED_STRING) ) {
                alt37=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 37, 0, input);

                throw nvae;
            }
            switch (alt37) {
                case 1 :
                    // InternalOCLinEcore.g:4622:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:4622:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                    // InternalOCLinEcore.g:4623:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionAssignment_0());
                    }
                    // InternalOCLinEcore.g:4624:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                    // InternalOCLinEcore.g:4624:2: rule__SpecificationCS__OwnedExpressionAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__SpecificationCS__OwnedExpressionAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getSpecificationCSAccess().getOwnedExpressionAssignment_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4628:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:4628:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                    // InternalOCLinEcore.g:4629:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSpecificationCSAccess().getExprStringAssignment_1());
                    }
                    // InternalOCLinEcore.g:4630:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                    // InternalOCLinEcore.g:4630:2: rule__SpecificationCS__ExprStringAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__SpecificationCS__ExprStringAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getSpecificationCSAccess().getExprStringAssignment_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SpecificationCS__Alternatives"


    // $ANTLR start "rule__StructuredClassCS__Alternatives_7"
    // InternalOCLinEcore.g:4639:1: rule__StructuredClassCS__Alternatives_7 : ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) );
    public final void rule__StructuredClassCS__Alternatives_7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4643:1: ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) )
            int alt38=2;
            int LA38_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt38) {
                case 1 :
                    // InternalOCLinEcore.g:4644:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4644:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
                    // InternalOCLinEcore.g:4645:1: ( rule__StructuredClassCS__Group_7_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getGroup_7_0());
                    }
                    // InternalOCLinEcore.g:4646:1: ( rule__StructuredClassCS__Group_7_0__0 )
                    // InternalOCLinEcore.g:4646:2: rule__StructuredClassCS__Group_7_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__Group_7_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getGroup_7_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4650:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4650:6: ( ';' )
                    // InternalOCLinEcore.g:4651:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getSemicolonKeyword_7_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getSemicolonKeyword_7_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Alternatives_7"


    // $ANTLR start "rule__StructuredClassCS__Alternatives_7_0_1"
    // InternalOCLinEcore.g:4663:1: rule__StructuredClassCS__Alternatives_7_0_1 : ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) );
    public final void rule__StructuredClassCS__Alternatives_7_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4667:1: ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) )
            int alt39=4;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 60:
                {
                alt39=1;
                }
                break;
            case 46:
                {
                switch ( input.LA(2) ) {
                case 24:
                    {
                    int LA39_7 = input.LA(3);

                    if ( (LA39_7==18||LA39_7==42) ) {
                        alt39=3;
                    }
                    else if ( (LA39_7==36) ) {
                        alt39=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 7, input);

                        throw nvae;
                    }
                    }
                    break;
                case 18:
                case 42:
                    {
                    alt39=3;
                    }
                    break;
                case 36:
                    {
                    alt39=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 39, 2, input);

                    throw nvae;
                }

                }
                break;
            case 24:
                {
                switch ( input.LA(2) ) {
                case 46:
                    {
                    int LA39_8 = input.LA(3);

                    if ( (LA39_8==18||LA39_8==42) ) {
                        alt39=3;
                    }
                    else if ( (LA39_8==36) ) {
                        alt39=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 8, input);

                        throw nvae;
                    }
                    }
                    break;
                case 18:
                case 42:
                    {
                    alt39=3;
                    }
                    break;
                case 36:
                    {
                    alt39=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 39, 3, input);

                    throw nvae;
                }

                }
                break;
            case 36:
                {
                alt39=2;
                }
                break;
            case 18:
            case 42:
                {
                alt39=3;
                }
                break;
            case 20:
            case 56:
                {
                alt39=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 39, 0, input);

                throw nvae;
            }

            switch (alt39) {
                case 1 :
                    // InternalOCLinEcore.g:4668:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4668:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    // InternalOCLinEcore.g:4669:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }
                    // InternalOCLinEcore.g:4670:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    // InternalOCLinEcore.g:4670:2: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4674:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4674:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
                    // InternalOCLinEcore.g:4675:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsAssignment_7_0_1_1());
                    }
                    // InternalOCLinEcore.g:4676:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
                    // InternalOCLinEcore.g:4676:2: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsAssignment_7_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4680:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:4680:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
                    // InternalOCLinEcore.g:4681:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesAssignment_7_0_1_2());
                    }
                    // InternalOCLinEcore.g:4682:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
                    // InternalOCLinEcore.g:4682:2: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesAssignment_7_0_1_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4686:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
                    {
                    // InternalOCLinEcore.g:4686:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
                    // InternalOCLinEcore.g:4687:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsAssignment_7_0_1_3());
                    }
                    // InternalOCLinEcore.g:4688:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
                    // InternalOCLinEcore.g:4688:2: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsAssignment_7_0_1_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Alternatives_7_0_1"


    // $ANTLR start "rule__StructuralFeatureCS__Alternatives"
    // InternalOCLinEcore.g:4697:1: rule__StructuralFeatureCS__Alternatives : ( ( ruleAttributeCS ) | ( ruleReferenceCS ) );
    public final void rule__StructuralFeatureCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4701:1: ( ( ruleAttributeCS ) | ( ruleReferenceCS ) )
            int alt40=2;
            switch ( input.LA(1) ) {
            case 46:
                {
                switch ( input.LA(2) ) {
                case 24:
                    {
                    int LA40_5 = input.LA(3);

                    if ( (LA40_5==18) ) {
                        alt40=1;
                    }
                    else if ( (LA40_5==42) ) {
                        alt40=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 40, 5, input);

                        throw nvae;
                    }
                    }
                    break;
                case 42:
                    {
                    alt40=2;
                    }
                    break;
                case 18:
                    {
                    alt40=1;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 40, 1, input);

                    throw nvae;
                }

                }
                break;
            case 24:
                {
                switch ( input.LA(2) ) {
                case 46:
                    {
                    int LA40_6 = input.LA(3);

                    if ( (LA40_6==18) ) {
                        alt40=1;
                    }
                    else if ( (LA40_6==42) ) {
                        alt40=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 40, 6, input);

                        throw nvae;
                    }
                    }
                    break;
                case 18:
                    {
                    alt40=1;
                    }
                    break;
                case 42:
                    {
                    alt40=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 40, 2, input);

                    throw nvae;
                }

                }
                break;
            case 18:
                {
                alt40=1;
                }
                break;
            case 42:
                {
                alt40=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 40, 0, input);

                throw nvae;
            }

            switch (alt40) {
                case 1 :
                    // InternalOCLinEcore.g:4702:1: ( ruleAttributeCS )
                    {
                    // InternalOCLinEcore.g:4702:1: ( ruleAttributeCS )
                    // InternalOCLinEcore.g:4703:1: ruleAttributeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuralFeatureCSAccess().getAttributeCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleAttributeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuralFeatureCSAccess().getAttributeCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4708:6: ( ruleReferenceCS )
                    {
                    // InternalOCLinEcore.g:4708:6: ( ruleReferenceCS )
                    // InternalOCLinEcore.g:4709:1: ruleReferenceCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuralFeatureCSAccess().getReferenceCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleReferenceCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getStructuralFeatureCSAccess().getReferenceCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuralFeatureCS__Alternatives"


    // $ANTLR start "rule__SysMLCS__Alternatives_2"
    // InternalOCLinEcore.g:4719:1: rule__SysMLCS__Alternatives_2 : ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) );
    public final void rule__SysMLCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4723:1: ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) )
            int alt41=2;
            int LA41_0 = input.LA(1);

            if ( (LA41_0==RULE_SINGLE_QUOTED_STRING||(LA41_0>=RULE_SIMPLE_ID && LA41_0<=RULE_ESCAPED_ID)||(LA41_0>=17 && LA41_0<=51)||(LA41_0>=54 && LA41_0<=60)) ) {
                alt41=1;
            }
            else if ( (LA41_0==106) ) {
                alt41=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 41, 0, input);

                throw nvae;
            }
            switch (alt41) {
                case 1 :
                    // InternalOCLinEcore.g:4724:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4724:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
                    // InternalOCLinEcore.g:4725:1: ( rule__SysMLCS__Group_2_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSysMLCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:4726:1: ( rule__SysMLCS__Group_2_0__0 )
                    // InternalOCLinEcore.g:4726:2: rule__SysMLCS__Group_2_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__SysMLCS__Group_2_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getSysMLCSAccess().getGroup_2_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4730:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4730:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
                    // InternalOCLinEcore.g:4731:1: ( rule__SysMLCS__Group_2_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSysMLCSAccess().getGroup_2_1());
                    }
                    // InternalOCLinEcore.g:4732:1: ( rule__SysMLCS__Group_2_1__0 )
                    // InternalOCLinEcore.g:4732:2: rule__SysMLCS__Group_2_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__SysMLCS__Group_2_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getSysMLCSAccess().getGroup_2_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Alternatives_2"


    // $ANTLR start "rule__TemplateSignatureCS__Alternatives"
    // InternalOCLinEcore.g:4742:1: rule__TemplateSignatureCS__Alternatives : ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) );
    public final void rule__TemplateSignatureCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4746:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( (LA42_0==102) ) {
                alt42=1;
            }
            else if ( (LA42_0==68) ) {
                alt42=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 42, 0, input);

                throw nvae;
            }
            switch (alt42) {
                case 1 :
                    // InternalOCLinEcore.g:4747:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4747:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:4748:1: ( rule__TemplateSignatureCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:4749:1: ( rule__TemplateSignatureCS__Group_0__0 )
                    // InternalOCLinEcore.g:4749:2: rule__TemplateSignatureCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TemplateSignatureCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTemplateSignatureCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4753:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4753:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:4754:1: ( rule__TemplateSignatureCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:4755:1: ( rule__TemplateSignatureCS__Group_1__0 )
                    // InternalOCLinEcore.g:4755:2: rule__TemplateSignatureCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TemplateSignatureCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTemplateSignatureCSAccess().getGroup_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Alternatives"


    // $ANTLR start "rule__TypedRefCS__Alternatives"
    // InternalOCLinEcore.g:4764:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
    public final void rule__TypedRefCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4768:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
            int alt43=2;
            int LA43_0 = input.LA(1);

            if ( ((LA43_0>=85 && LA43_0<=99)) ) {
                alt43=1;
            }
            else if ( ((LA43_0>=RULE_SIMPLE_ID && LA43_0<=RULE_ESCAPED_ID)||(LA43_0>=17 && LA43_0<=51)||(LA43_0>=54 && LA43_0<=60)) ) {
                alt43=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 43, 0, input);

                throw nvae;
            }
            switch (alt43) {
                case 1 :
                    // InternalOCLinEcore.g:4769:1: ( ruleTypeLiteralCS )
                    {
                    // InternalOCLinEcore.g:4769:1: ( ruleTypeLiteralCS )
                    // InternalOCLinEcore.g:4770:1: ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedRefCSAccess().getTypeLiteralCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeLiteralCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypedRefCSAccess().getTypeLiteralCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4775:6: ( ruleTypedTypeRefCS )
                    {
                    // InternalOCLinEcore.g:4775:6: ( ruleTypedTypeRefCS )
                    // InternalOCLinEcore.g:4776:1: ruleTypedTypeRefCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypedTypeRefCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedRefCS__Alternatives"


    // $ANTLR start "rule__TypedTypeRefCS__Alternatives_1"
    // InternalOCLinEcore.g:4786:1: rule__TypedTypeRefCS__Alternatives_1 : ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) );
    public final void rule__TypedTypeRefCS__Alternatives_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4790:1: ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) )
            int alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==102) ) {
                alt44=1;
            }
            else if ( (LA44_0==68) ) {
                alt44=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 44, 0, input);

                throw nvae;
            }
            switch (alt44) {
                case 1 :
                    // InternalOCLinEcore.g:4791:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4791:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
                    // InternalOCLinEcore.g:4792:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_0());
                    }
                    // InternalOCLinEcore.g:4793:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
                    // InternalOCLinEcore.g:4793:2: rule__TypedTypeRefCS__Group_1_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypedTypeRefCS__Group_1_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4797:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4797:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
                    // InternalOCLinEcore.g:4798:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_1());
                    }
                    // InternalOCLinEcore.g:4799:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
                    // InternalOCLinEcore.g:4799:2: rule__TypedTypeRefCS__Group_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypedTypeRefCS__Group_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Alternatives_1"


    // $ANTLR start "rule__UnrestrictedName__Alternatives"
    // InternalOCLinEcore.g:4808:1: rule__UnrestrictedName__Alternatives : ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) );
    public final void rule__UnrestrictedName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4812:1: ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) )
            int alt45=8;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 18:
            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:
                {
                alt45=1;
                }
                break;
            case 54:
                {
                alt45=2;
                }
                break;
            case 55:
                {
                alt45=3;
                }
                break;
            case 56:
                {
                alt45=4;
                }
                break;
            case 57:
                {
                alt45=5;
                }
                break;
            case 58:
                {
                alt45=6;
                }
                break;
            case 59:
                {
                alt45=7;
                }
                break;
            case 60:
                {
                alt45=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;
            }

            switch (alt45) {
                case 1 :
                    // InternalOCLinEcore.g:4813:1: ( ruleEnumerationLiteralName )
                    {
                    // InternalOCLinEcore.g:4813:1: ( ruleEnumerationLiteralName )
                    // InternalOCLinEcore.g:4814:1: ruleEnumerationLiteralName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getEnumerationLiteralNameParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleEnumerationLiteralName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getEnumerationLiteralNameParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4819:6: ( 'annotation' )
                    {
                    // InternalOCLinEcore.g:4819:6: ( 'annotation' )
                    // InternalOCLinEcore.g:4820:1: 'annotation'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getAnnotationKeyword_1());
                    }
                    match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getAnnotationKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4827:6: ( 'documentation' )
                    {
                    // InternalOCLinEcore.g:4827:6: ( 'documentation' )
                    // InternalOCLinEcore.g:4828:1: 'documentation'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getDocumentationKeyword_2());
                    }
                    match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getDocumentationKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4835:6: ( 'invariant' )
                    {
                    // InternalOCLinEcore.g:4835:6: ( 'invariant' )
                    // InternalOCLinEcore.g:4836:1: 'invariant'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getInvariantKeyword_3());
                    }
                    match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getInvariantKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4843:6: ( 'literal' )
                    {
                    // InternalOCLinEcore.g:4843:6: ( 'literal' )
                    // InternalOCLinEcore.g:4844:1: 'literal'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getLiteralKeyword_4());
                    }
                    match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getLiteralKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4851:6: ( 'opposite' )
                    {
                    // InternalOCLinEcore.g:4851:6: ( 'opposite' )
                    // InternalOCLinEcore.g:4852:1: 'opposite'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getOppositeKeyword_5());
                    }
                    match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getOppositeKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4859:6: ( 'serializable' )
                    {
                    // InternalOCLinEcore.g:4859:6: ( 'serializable' )
                    // InternalOCLinEcore.g:4860:1: 'serializable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_6());
                    }
                    match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4867:6: ( 'sysml' )
                    {
                    // InternalOCLinEcore.g:4867:6: ( 'sysml' )
                    // InternalOCLinEcore.g:4868:1: 'sysml'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_7());
                    }
                    match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_7());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UnrestrictedName__Alternatives"


    // $ANTLR start "rule__EssentialOCLUnaryOperatorName__Alternatives"
    // InternalOCLinEcore.g:4881:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
    public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4885:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
            int alt46=3;
            switch ( input.LA(1) ) {
            case 61:
                {
                alt46=1;
                }
                break;
            case 62:
                {
                alt46=2;
                }
                break;
            case 63:
                {
                alt46=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 46, 0, input);

                throw nvae;
            }

            switch (alt46) {
                case 1 :
                    // InternalOCLinEcore.g:4886:1: ( '-' )
                    {
                    // InternalOCLinEcore.g:4886:1: ( '-' )
                    // InternalOCLinEcore.g:4887:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
                    }
                    match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4894:6: ( 'not' )
                    {
                    // InternalOCLinEcore.g:4894:6: ( 'not' )
                    // InternalOCLinEcore.g:4895:1: 'not'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
                    }
                    match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4902:6: ( 'not2' )
                    {
                    // InternalOCLinEcore.g:4902:6: ( 'not2' )
                    // InternalOCLinEcore.g:4903:1: 'not2'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
                    }
                    match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EssentialOCLUnaryOperatorName__Alternatives"


    // $ANTLR start "rule__EssentialOCLInfixOperatorName__Alternatives"
    // InternalOCLinEcore.g:4915:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
    public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4919:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
            int alt47=18;
            switch ( input.LA(1) ) {
            case 64:
                {
                alt47=1;
                }
                break;
            case 65:
                {
                alt47=2;
                }
                break;
            case 66:
                {
                alt47=3;
                }
                break;
            case 61:
                {
                alt47=4;
                }
                break;
            case 67:
                {
                alt47=5;
                }
                break;
            case 68:
                {
                alt47=6;
                }
                break;
            case 69:
                {
                alt47=7;
                }
                break;
            case 70:
                {
                alt47=8;
                }
                break;
            case 71:
                {
                alt47=9;
                }
                break;
            case 72:
                {
                alt47=10;
                }
                break;
            case 73:
                {
                alt47=11;
                }
                break;
            case 74:
                {
                alt47=12;
                }
                break;
            case 75:
                {
                alt47=13;
                }
                break;
            case 76:
                {
                alt47=14;
                }
                break;
            case 77:
                {
                alt47=15;
                }
                break;
            case 78:
                {
                alt47=16;
                }
                break;
            case 79:
                {
                alt47=17;
                }
                break;
            case 80:
                {
                alt47=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 47, 0, input);

                throw nvae;
            }

            switch (alt47) {
                case 1 :
                    // InternalOCLinEcore.g:4920:1: ( '*' )
                    {
                    // InternalOCLinEcore.g:4920:1: ( '*' )
                    // InternalOCLinEcore.g:4921:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
                    }
                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4928:6: ( '/' )
                    {
                    // InternalOCLinEcore.g:4928:6: ( '/' )
                    // InternalOCLinEcore.g:4929:1: '/'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
                    }
                    match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4936:6: ( '+' )
                    {
                    // InternalOCLinEcore.g:4936:6: ( '+' )
                    // InternalOCLinEcore.g:4937:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
                    }
                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4944:6: ( '-' )
                    {
                    // InternalOCLinEcore.g:4944:6: ( '-' )
                    // InternalOCLinEcore.g:4945:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
                    }
                    match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4952:6: ( '>' )
                    {
                    // InternalOCLinEcore.g:4952:6: ( '>' )
                    // InternalOCLinEcore.g:4953:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
                    }
                    match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4960:6: ( '<' )
                    {
                    // InternalOCLinEcore.g:4960:6: ( '<' )
                    // InternalOCLinEcore.g:4961:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
                    }
                    match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4968:6: ( '>=' )
                    {
                    // InternalOCLinEcore.g:4968:6: ( '>=' )
                    // InternalOCLinEcore.g:4969:1: '>='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
                    }
                    match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4976:6: ( '<=' )
                    {
                    // InternalOCLinEcore.g:4976:6: ( '<=' )
                    // InternalOCLinEcore.g:4977:1: '<='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
                    }
                    match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:4984:6: ( '=' )
                    {
                    // InternalOCLinEcore.g:4984:6: ( '=' )
                    // InternalOCLinEcore.g:4985:1: '='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
                    }
                    match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:4992:6: ( '<>' )
                    {
                    // InternalOCLinEcore.g:4992:6: ( '<>' )
                    // InternalOCLinEcore.g:4993:1: '<>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
                    }
                    match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:5000:6: ( 'and' )
                    {
                    // InternalOCLinEcore.g:5000:6: ( 'and' )
                    // InternalOCLinEcore.g:5001:1: 'and'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
                    }
                    match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:5008:6: ( 'and2' )
                    {
                    // InternalOCLinEcore.g:5008:6: ( 'and2' )
                    // InternalOCLinEcore.g:5009:1: 'and2'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
                    }
                    match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:5016:6: ( 'implies' )
                    {
                    // InternalOCLinEcore.g:5016:6: ( 'implies' )
                    // InternalOCLinEcore.g:5017:1: 'implies'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
                    }
                    match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:5024:6: ( 'implies2' )
                    {
                    // InternalOCLinEcore.g:5024:6: ( 'implies2' )
                    // InternalOCLinEcore.g:5025:1: 'implies2'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
                    }
                    match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
                    }

                    }


                    }
                    break;
                case 15 :
                    // InternalOCLinEcore.g:5032:6: ( 'or' )
                    {
                    // InternalOCLinEcore.g:5032:6: ( 'or' )
                    // InternalOCLinEcore.g:5033:1: 'or'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
                    }
                    match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
                    }

                    }


                    }
                    break;
                case 16 :
                    // InternalOCLinEcore.g:5040:6: ( 'or2' )
                    {
                    // InternalOCLinEcore.g:5040:6: ( 'or2' )
                    // InternalOCLinEcore.g:5041:1: 'or2'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
                    }
                    match(input,78,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
                    }

                    }


                    }
                    break;
                case 17 :
                    // InternalOCLinEcore.g:5048:6: ( 'xor' )
                    {
                    // InternalOCLinEcore.g:5048:6: ( 'xor' )
                    // InternalOCLinEcore.g:5049:1: 'xor'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
                    }
                    match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
                    }

                    }


                    }
                    break;
                case 18 :
                    // InternalOCLinEcore.g:5056:6: ( 'xor2' )
                    {
                    // InternalOCLinEcore.g:5056:6: ( 'xor2' )
                    // InternalOCLinEcore.g:5057:1: 'xor2'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
                    }
                    match(input,80,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EssentialOCLInfixOperatorName__Alternatives"


    // $ANTLR start "rule__EssentialOCLNavigationOperatorName__Alternatives"
    // InternalOCLinEcore.g:5069:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
    public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5073:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
            int alt48=4;
            switch ( input.LA(1) ) {
            case 81:
                {
                alt48=1;
                }
                break;
            case 82:
                {
                alt48=2;
                }
                break;
            case 83:
                {
                alt48=3;
                }
                break;
            case 84:
                {
                alt48=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 48, 0, input);

                throw nvae;
            }

            switch (alt48) {
                case 1 :
                    // InternalOCLinEcore.g:5074:1: ( '.' )
                    {
                    // InternalOCLinEcore.g:5074:1: ( '.' )
                    // InternalOCLinEcore.g:5075:1: '.'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
                    }
                    match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5082:6: ( '->' )
                    {
                    // InternalOCLinEcore.g:5082:6: ( '->' )
                    // InternalOCLinEcore.g:5083:1: '->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
                    }
                    match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5090:6: ( '?.' )
                    {
                    // InternalOCLinEcore.g:5090:6: ( '?.' )
                    // InternalOCLinEcore.g:5091:1: '?.'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
                    }
                    match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5098:6: ( '?->' )
                    {
                    // InternalOCLinEcore.g:5098:6: ( '?->' )
                    // InternalOCLinEcore.g:5099:1: '?->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
                    }
                    match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EssentialOCLNavigationOperatorName__Alternatives"


    // $ANTLR start "rule__BinaryOperatorName__Alternatives"
    // InternalOCLinEcore.g:5111:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
    public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5115:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==61||(LA49_0>=64 && LA49_0<=80)) ) {
                alt49=1;
            }
            else if ( ((LA49_0>=81 && LA49_0<=84)) ) {
                alt49=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 49, 0, input);

                throw nvae;
            }
            switch (alt49) {
                case 1 :
                    // InternalOCLinEcore.g:5116:1: ( ruleInfixOperatorName )
                    {
                    // InternalOCLinEcore.g:5116:1: ( ruleInfixOperatorName )
                    // InternalOCLinEcore.g:5117:1: ruleInfixOperatorName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleInfixOperatorName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5122:6: ( ruleNavigationOperatorName )
                    {
                    // InternalOCLinEcore.g:5122:6: ( ruleNavigationOperatorName )
                    // InternalOCLinEcore.g:5123:1: ruleNavigationOperatorName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNavigationOperatorName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__BinaryOperatorName__Alternatives"


    // $ANTLR start "rule__EssentialOCLUnreservedName__Alternatives"
    // InternalOCLinEcore.g:5133:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
    public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5137:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
            int alt50=5;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 18:
            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 54:
            case 55:
            case 56:
            case 57:
            case 58:
            case 59:
            case 60:
                {
                alt50=1;
                }
                break;
            case 95:
            case 96:
            case 97:
            case 98:
            case 99:
                {
                alt50=2;
                }
                break;
            case 87:
            case 88:
            case 89:
            case 90:
            case 91:
            case 92:
            case 93:
            case 94:
                {
                alt50=3;
                }
                break;
            case 85:
                {
                alt50=4;
                }
                break;
            case 86:
                {
                alt50=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 50, 0, input);

                throw nvae;
            }

            switch (alt50) {
                case 1 :
                    // InternalOCLinEcore.g:5138:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:5138:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:5139:1: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5144:6: ( ruleCollectionTypeIdentifier )
                    {
                    // InternalOCLinEcore.g:5144:6: ( ruleCollectionTypeIdentifier )
                    // InternalOCLinEcore.g:5145:1: ruleCollectionTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleCollectionTypeIdentifier();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5150:6: ( rulePrimitiveTypeIdentifier )
                    {
                    // InternalOCLinEcore.g:5150:6: ( rulePrimitiveTypeIdentifier )
                    // InternalOCLinEcore.g:5151:1: rulePrimitiveTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePrimitiveTypeIdentifier();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5156:6: ( 'Map' )
                    {
                    // InternalOCLinEcore.g:5156:6: ( 'Map' )
                    // InternalOCLinEcore.g:5157:1: 'Map'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
                    }
                    match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5164:6: ( 'Tuple' )
                    {
                    // InternalOCLinEcore.g:5164:6: ( 'Tuple' )
                    // InternalOCLinEcore.g:5165:1: 'Tuple'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
                    }
                    match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EssentialOCLUnreservedName__Alternatives"


    // $ANTLR start "rule__URIFirstPathElementCS__Alternatives"
    // InternalOCLinEcore.g:5177:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
    public final void rule__URIFirstPathElementCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5181:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
            int alt51=2;
            int LA51_0 = input.LA(1);

            if ( ((LA51_0>=RULE_SIMPLE_ID && LA51_0<=RULE_ESCAPED_ID)||(LA51_0>=17 && LA51_0<=51)||(LA51_0>=54 && LA51_0<=60)) ) {
                alt51=1;
            }
            else if ( (LA51_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt51=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 51, 0, input);

                throw nvae;
            }
            switch (alt51) {
                case 1 :
                    // InternalOCLinEcore.g:5182:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:5182:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                    // InternalOCLinEcore.g:5183:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                    }
                    // InternalOCLinEcore.g:5184:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                    // InternalOCLinEcore.g:5184:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__URIFirstPathElementCS__ReferredElementAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5188:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5188:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:5189:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:5190:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                    // InternalOCLinEcore.g:5190:2: rule__URIFirstPathElementCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__URIFirstPathElementCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__Alternatives"


    // $ANTLR start "rule__PrimitiveTypeIdentifier__Alternatives"
    // InternalOCLinEcore.g:5199:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
    public final void rule__PrimitiveTypeIdentifier__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5203:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
            int alt52=8;
            switch ( input.LA(1) ) {
            case 87:
                {
                alt52=1;
                }
                break;
            case 88:
                {
                alt52=2;
                }
                break;
            case 89:
                {
                alt52=3;
                }
                break;
            case 90:
                {
                alt52=4;
                }
                break;
            case 91:
                {
                alt52=5;
                }
                break;
            case 92:
                {
                alt52=6;
                }
                break;
            case 93:
                {
                alt52=7;
                }
                break;
            case 94:
                {
                alt52=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 52, 0, input);

                throw nvae;
            }

            switch (alt52) {
                case 1 :
                    // InternalOCLinEcore.g:5204:1: ( 'Boolean' )
                    {
                    // InternalOCLinEcore.g:5204:1: ( 'Boolean' )
                    // InternalOCLinEcore.g:5205:1: 'Boolean'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
                    }
                    match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5212:6: ( 'Integer' )
                    {
                    // InternalOCLinEcore.g:5212:6: ( 'Integer' )
                    // InternalOCLinEcore.g:5213:1: 'Integer'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
                    }
                    match(input,88,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5220:6: ( 'Real' )
                    {
                    // InternalOCLinEcore.g:5220:6: ( 'Real' )
                    // InternalOCLinEcore.g:5221:1: 'Real'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
                    }
                    match(input,89,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5228:6: ( 'String' )
                    {
                    // InternalOCLinEcore.g:5228:6: ( 'String' )
                    // InternalOCLinEcore.g:5229:1: 'String'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
                    }
                    match(input,90,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5236:6: ( 'UnlimitedNatural' )
                    {
                    // InternalOCLinEcore.g:5236:6: ( 'UnlimitedNatural' )
                    // InternalOCLinEcore.g:5237:1: 'UnlimitedNatural'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
                    }
                    match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5244:6: ( 'OclAny' )
                    {
                    // InternalOCLinEcore.g:5244:6: ( 'OclAny' )
                    // InternalOCLinEcore.g:5245:1: 'OclAny'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
                    }
                    match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:5252:6: ( 'OclInvalid' )
                    {
                    // InternalOCLinEcore.g:5252:6: ( 'OclInvalid' )
                    // InternalOCLinEcore.g:5253:1: 'OclInvalid'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
                    }
                    match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:5260:6: ( 'OclVoid' )
                    {
                    // InternalOCLinEcore.g:5260:6: ( 'OclVoid' )
                    // InternalOCLinEcore.g:5261:1: 'OclVoid'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
                    }
                    match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrimitiveTypeIdentifier__Alternatives"


    // $ANTLR start "rule__CollectionTypeIdentifier__Alternatives"
    // InternalOCLinEcore.g:5273:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
    public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5277:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
            int alt53=5;
            switch ( input.LA(1) ) {
            case 95:
                {
                alt53=1;
                }
                break;
            case 96:
                {
                alt53=2;
                }
                break;
            case 97:
                {
                alt53=3;
                }
                break;
            case 98:
                {
                alt53=4;
                }
                break;
            case 99:
                {
                alt53=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 53, 0, input);

                throw nvae;
            }

            switch (alt53) {
                case 1 :
                    // InternalOCLinEcore.g:5278:1: ( 'Set' )
                    {
                    // InternalOCLinEcore.g:5278:1: ( 'Set' )
                    // InternalOCLinEcore.g:5279:1: 'Set'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
                    }
                    match(input,95,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5286:6: ( 'Bag' )
                    {
                    // InternalOCLinEcore.g:5286:6: ( 'Bag' )
                    // InternalOCLinEcore.g:5287:1: 'Bag'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
                    }
                    match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5294:6: ( 'Sequence' )
                    {
                    // InternalOCLinEcore.g:5294:6: ( 'Sequence' )
                    // InternalOCLinEcore.g:5295:1: 'Sequence'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
                    }
                    match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5302:6: ( 'Collection' )
                    {
                    // InternalOCLinEcore.g:5302:6: ( 'Collection' )
                    // InternalOCLinEcore.g:5303:1: 'Collection'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
                    }
                    match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5310:6: ( 'OrderedSet' )
                    {
                    // InternalOCLinEcore.g:5310:6: ( 'OrderedSet' )
                    // InternalOCLinEcore.g:5311:1: 'OrderedSet'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
                    }
                    match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeIdentifier__Alternatives"


    // $ANTLR start "rule__CollectionLiteralPartCS__Alternatives"
    // InternalOCLinEcore.g:5323:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
    public final void rule__CollectionLiteralPartCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5327:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
            int alt54=2;
            alt54 = dfa54.predict(input);
            switch (alt54) {
                case 1 :
                    // InternalOCLinEcore.g:5328:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5328:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5329:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5330:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                    // InternalOCLinEcore.g:5330:2: rule__CollectionLiteralPartCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionLiteralPartCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5334:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:5334:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                    // InternalOCLinEcore.g:5335:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                    }
                    // InternalOCLinEcore.g:5336:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                    // InternalOCLinEcore.g:5336:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Alternatives"


    // $ANTLR start "rule__ShadowPartCS__Alternatives"
    // InternalOCLinEcore.g:5345:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
    public final void rule__ShadowPartCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5349:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( ((LA55_0>=RULE_SIMPLE_ID && LA55_0<=RULE_ESCAPED_ID)||(LA55_0>=17 && LA55_0<=51)||(LA55_0>=54 && LA55_0<=60)) ) {
                alt55=1;
            }
            else if ( (LA55_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt55=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 55, 0, input);

                throw nvae;
            }
            switch (alt55) {
                case 1 :
                    // InternalOCLinEcore.g:5350:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5350:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5351:1: ( rule__ShadowPartCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5352:1: ( rule__ShadowPartCS__Group_0__0 )
                    // InternalOCLinEcore.g:5352:2: rule__ShadowPartCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ShadowPartCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getShadowPartCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5356:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:5356:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                    // InternalOCLinEcore.g:5357:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                    }
                    // InternalOCLinEcore.g:5358:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                    // InternalOCLinEcore.g:5358:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ShadowPartCS__OwnedInitExpressionAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Alternatives"


    // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"
    // InternalOCLinEcore.g:5367:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
    public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5371:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
            int alt56=2;
            alt56 = dfa56.predict(input);
            switch (alt56) {
                case 1 :
                    // InternalOCLinEcore.g:5372:1: ( ruleExpCS )
                    {
                    // InternalOCLinEcore.g:5372:1: ( ruleExpCS )
                    // InternalOCLinEcore.g:5373:1: ruleExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5378:6: ( rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:5378:6: ( rulePatternExpCS )
                    // InternalOCLinEcore.g:5379:1: rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePatternExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"


    // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
    // InternalOCLinEcore.g:5389:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
    public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5393:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
            int alt57=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt57=1;
                }
                break;
            case RULE_SINGLE_QUOTED_STRING:
                {
                alt57=2;
                }
                break;
            case 139:
            case 140:
                {
                alt57=3;
                }
                break;
            case 64:
                {
                alt57=4;
                }
                break;
            case 114:
                {
                alt57=5;
                }
                break;
            case 115:
                {
                alt57=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 57, 0, input);

                throw nvae;
            }

            switch (alt57) {
                case 1 :
                    // InternalOCLinEcore.g:5394:1: ( ruleNumberLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5394:1: ( ruleNumberLiteralExpCS )
                    // InternalOCLinEcore.g:5395:1: ruleNumberLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNumberLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5400:6: ( ruleStringLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5400:6: ( ruleStringLiteralExpCS )
                    // InternalOCLinEcore.g:5401:1: ruleStringLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleStringLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5406:6: ( ruleBooleanLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5406:6: ( ruleBooleanLiteralExpCS )
                    // InternalOCLinEcore.g:5407:1: ruleBooleanLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleBooleanLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5412:6: ( ruleUnlimitedNaturalLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5412:6: ( ruleUnlimitedNaturalLiteralExpCS )
                    // InternalOCLinEcore.g:5413:1: ruleUnlimitedNaturalLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnlimitedNaturalLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5418:6: ( ruleInvalidLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5418:6: ( ruleInvalidLiteralExpCS )
                    // InternalOCLinEcore.g:5419:1: ruleInvalidLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleInvalidLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5424:6: ( ruleNullLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5424:6: ( ruleNullLiteralExpCS )
                    // InternalOCLinEcore.g:5425:1: ruleNullLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNullLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrimitiveLiteralExpCS__Alternatives"


    // $ANTLR start "rule__BooleanLiteralExpCS__Alternatives"
    // InternalOCLinEcore.g:5435:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
    public final void rule__BooleanLiteralExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5439:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
            int alt58=2;
            int LA58_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt58) {
                case 1 :
                    // InternalOCLinEcore.g:5440:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:5440:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                    // InternalOCLinEcore.g:5441:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                    }
                    // InternalOCLinEcore.g:5442:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                    // InternalOCLinEcore.g:5442:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__BooleanLiteralExpCS__SymbolAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5446:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:5446:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                    // InternalOCLinEcore.g:5447:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                    }
                    // InternalOCLinEcore.g:5448:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                    // InternalOCLinEcore.g:5448:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__BooleanLiteralExpCS__SymbolAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__BooleanLiteralExpCS__Alternatives"


    // $ANTLR start "rule__TypeLiteralCS__Alternatives"
    // InternalOCLinEcore.g:5457:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
    public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5461:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
            int alt59=4;
            switch ( input.LA(1) ) {
            case 87:
            case 88:
            case 89:
            case 90:
            case 91:
            case 92:
            case 93:
            case 94:
                {
                alt59=1;
                }
                break;
            case 95:
            case 96:
            case 97:
            case 98:
            case 99:
                {
                alt59=2;
                }
                break;
            case 85:
                {
                alt59=3;
                }
                break;
            case 86:
                {
                alt59=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 59, 0, input);

                throw nvae;
            }

            switch (alt59) {
                case 1 :
                    // InternalOCLinEcore.g:5462:1: ( rulePrimitiveTypeCS )
                    {
                    // InternalOCLinEcore.g:5462:1: ( rulePrimitiveTypeCS )
                    // InternalOCLinEcore.g:5463:1: rulePrimitiveTypeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePrimitiveTypeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5468:6: ( ruleCollectionTypeCS )
                    {
                    // InternalOCLinEcore.g:5468:6: ( ruleCollectionTypeCS )
                    // InternalOCLinEcore.g:5469:1: ruleCollectionTypeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleCollectionTypeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5474:6: ( ruleMapTypeCS )
                    {
                    // InternalOCLinEcore.g:5474:6: ( ruleMapTypeCS )
                    // InternalOCLinEcore.g:5475:1: ruleMapTypeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleMapTypeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5480:6: ( ruleTupleTypeCS )
                    {
                    // InternalOCLinEcore.g:5480:6: ( ruleTupleTypeCS )
                    // InternalOCLinEcore.g:5481:1: ruleTupleTypeCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTupleTypeCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralCS__Alternatives"


    // $ANTLR start "rule__TypeExpWithoutMultiplicityCS__Alternatives"
    // InternalOCLinEcore.g:5491:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
    public final void rule__TypeExpWithoutMultiplicityCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5495:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
            int alt60=3;
            alt60 = dfa60.predict(input);
            switch (alt60) {
                case 1 :
                    // InternalOCLinEcore.g:5496:1: ( ruleTypeNameExpCS )
                    {
                    // InternalOCLinEcore.g:5496:1: ( ruleTypeNameExpCS )
                    // InternalOCLinEcore.g:5497:1: ruleTypeNameExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeNameExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
                    {
                    // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
                    // InternalOCLinEcore.g:5503:1: ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeLiteralCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5508:6: ( ruleCollectionPatternCS )
                    {
                    // InternalOCLinEcore.g:5508:6: ( ruleCollectionPatternCS )
                    // InternalOCLinEcore.g:5509:1: ruleCollectionPatternCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleCollectionPatternCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpWithoutMultiplicityCS__Alternatives"


    // $ANTLR start "rule__ExpCS__Alternatives"
    // InternalOCLinEcore.g:5519:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
    public final void rule__ExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5523:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
            int alt61=2;
            alt61 = dfa61.predict(input);
            switch (alt61) {
                case 1 :
                    // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5525:1: ( rule__ExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5526:1: ( rule__ExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5526:2: rule__ExpCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ExpCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getExpCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5530:6: ( rulePrefixedLetExpCS )
                    {
                    // InternalOCLinEcore.g:5530:6: ( rulePrefixedLetExpCS )
                    // InternalOCLinEcore.g:5531:1: rulePrefixedLetExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePrefixedLetExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Alternatives"


    // $ANTLR start "rule__PrefixedLetExpCS__Alternatives"
    // InternalOCLinEcore.g:5541:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
    public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5545:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
            int alt62=2;
            int LA62_0 = input.LA(1);

            if ( ((LA62_0>=61 && LA62_0<=63)) ) {
                alt62=1;
            }
            else if ( (LA62_0==125) ) {
                alt62=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 62, 0, input);

                throw nvae;
            }
            switch (alt62) {
                case 1 :
                    // InternalOCLinEcore.g:5546:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5546:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5547:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5548:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5548:2: rule__PrefixedLetExpCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PrefixedLetExpCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5552:6: ( ruleLetExpCS )
                    {
                    // InternalOCLinEcore.g:5552:6: ( ruleLetExpCS )
                    // InternalOCLinEcore.g:5553:1: ruleLetExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleLetExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Alternatives"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Alternatives"
    // InternalOCLinEcore.g:5563:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
    public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5567:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( ((LA63_0>=61 && LA63_0<=63)) ) {
                alt63=1;
            }
            else if ( ((LA63_0>=RULE_INT && LA63_0<=RULE_SINGLE_QUOTED_STRING)||(LA63_0>=RULE_SIMPLE_ID && LA63_0<=RULE_ESCAPED_ID)||(LA63_0>=17 && LA63_0<=51)||(LA63_0>=54 && LA63_0<=60)||LA63_0==64||(LA63_0>=85 && LA63_0<=99)||LA63_0==102||LA63_0==112||(LA63_0>=114 && LA63_0<=115)||LA63_0==120||LA63_0==126||(LA63_0>=139 && LA63_0<=140)) ) {
                alt63=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;
            }
            switch (alt63) {
                case 1 :
                    // InternalOCLinEcore.g:5568:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5568:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5569:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5570:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5570:2: rule__PrefixedPrimaryExpCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PrefixedPrimaryExpCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5574:6: ( rulePrimaryExpCS )
                    {
                    // InternalOCLinEcore.g:5574:6: ( rulePrimaryExpCS )
                    // InternalOCLinEcore.g:5575:1: rulePrimaryExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePrimaryExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Alternatives"


    // $ANTLR start "rule__PrimaryExpCS__Alternatives"
    // InternalOCLinEcore.g:5585:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
    public final void rule__PrimaryExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5589:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
            int alt64=10;
            alt64 = dfa64.predict(input);
            switch (alt64) {
                case 1 :
                    // InternalOCLinEcore.g:5590:1: ( ruleNestedExpCS )
                    {
                    // InternalOCLinEcore.g:5590:1: ( ruleNestedExpCS )
                    // InternalOCLinEcore.g:5591:1: ruleNestedExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNestedExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5596:6: ( ruleIfExpCS )
                    {
                    // InternalOCLinEcore.g:5596:6: ( ruleIfExpCS )
                    // InternalOCLinEcore.g:5597:1: ruleIfExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleIfExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5602:6: ( ruleSelfExpCS )
                    {
                    // InternalOCLinEcore.g:5602:6: ( ruleSelfExpCS )
                    // InternalOCLinEcore.g:5603:1: ruleSelfExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleSelfExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5608:6: ( rulePrimitiveLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5608:6: ( rulePrimitiveLiteralExpCS )
                    // InternalOCLinEcore.g:5609:1: rulePrimitiveLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePrimitiveLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
                    // InternalOCLinEcore.g:5615:1: ruleTupleLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTupleLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
                    // InternalOCLinEcore.g:5621:1: ruleMapLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleMapLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
                    // InternalOCLinEcore.g:5627:1: ruleCollectionLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleCollectionLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:5632:6: ( ruleLambdaLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5632:6: ( ruleLambdaLiteralExpCS )
                    // InternalOCLinEcore.g:5633:1: ruleLambdaLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleLambdaLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
                    // InternalOCLinEcore.g:5639:1: ruleTypeLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:5644:6: ( ruleNameExpCS )
                    {
                    // InternalOCLinEcore.g:5644:6: ( ruleNameExpCS )
                    // InternalOCLinEcore.g:5645:1: ruleNameExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNameExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrimaryExpCS__Alternatives"


    // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"
    // InternalOCLinEcore.g:5655:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
    public final void rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5659:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
            int alt65=3;
            switch ( input.LA(1) ) {
            case 105:
                {
                alt65=1;
                }
                break;
            case 52:
                {
                alt65=2;
                }
                break;
            case 142:
                {
                alt65=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;
            }

            switch (alt65) {
                case 1 :
                    // InternalOCLinEcore.g:5660:1: ( ruleNavigatingCommaArgCS )
                    {
                    // InternalOCLinEcore.g:5660:1: ( ruleNavigatingCommaArgCS )
                    // InternalOCLinEcore.g:5661:1: ruleNavigatingCommaArgCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNavigatingCommaArgCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5666:6: ( ruleNavigatingSemiArgCS )
                    {
                    // InternalOCLinEcore.g:5666:6: ( ruleNavigatingSemiArgCS )
                    // InternalOCLinEcore.g:5667:1: ruleNavigatingSemiArgCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNavigatingSemiArgCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5672:6: ( ruleNavigatingBarArgCS )
                    {
                    // InternalOCLinEcore.g:5672:6: ( ruleNavigatingBarArgCS )
                    // InternalOCLinEcore.g:5673:1: ruleNavigatingBarArgCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleNavigatingBarArgCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"


    // $ANTLR start "rule__NavigatingArgCS__Alternatives"
    // InternalOCLinEcore.g:5683:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
    public final void rule__NavigatingArgCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5687:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( ((LA66_0>=RULE_INT && LA66_0<=RULE_SINGLE_QUOTED_STRING)||(LA66_0>=RULE_SIMPLE_ID && LA66_0<=RULE_ESCAPED_ID)||(LA66_0>=17 && LA66_0<=51)||(LA66_0>=54 && LA66_0<=64)||(LA66_0>=85 && LA66_0<=99)||LA66_0==102||LA66_0==112||(LA66_0>=114 && LA66_0<=115)||LA66_0==120||(LA66_0>=125 && LA66_0<=126)||(LA66_0>=139 && LA66_0<=140)) ) {
                alt66=1;
            }
            else if ( (LA66_0==104) ) {
                alt66=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 66, 0, input);

                throw nvae;
            }
            switch (alt66) {
                case 1 :
                    // InternalOCLinEcore.g:5688:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5688:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5689:1: ( rule__NavigatingArgCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5690:1: ( rule__NavigatingArgCS__Group_0__0 )
                    // InternalOCLinEcore.g:5690:2: rule__NavigatingArgCS__Group_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5694:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5694:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:5695:1: ( rule__NavigatingArgCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:5696:1: ( rule__NavigatingArgCS__Group_1__0 )
                    // InternalOCLinEcore.g:5696:2: rule__NavigatingArgCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Alternatives"


    // $ANTLR start "rule__NavigatingArgCS__Alternatives_0_1"
    // InternalOCLinEcore.g:5705:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
    public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5709:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
            int alt67=3;
            switch ( input.LA(1) ) {
            case 113:
                {
                int LA67_1 = input.LA(2);

                if ( (synpred210_InternalOCLinEcore()) ) {
                    alt67=1;
                }
                else if ( (true) ) {
                    alt67=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 67, 1, input);

                    throw nvae;
                }
                }
                break;
            case 104:
                {
                int LA67_2 = input.LA(2);

                if ( (synpred211_InternalOCLinEcore()) ) {
                    alt67=2;
                }
                else if ( (true) ) {
                    alt67=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 67, 2, input);

                    throw nvae;
                }
                }
                break;
            case 119:
                {
                alt67=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 67, 0, input);

                throw nvae;
            }

            switch (alt67) {
                case 1 :
                    // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                    // InternalOCLinEcore.g:5711:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                    }
                    // InternalOCLinEcore.g:5712:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                    // InternalOCLinEcore.g:5712:2: rule__NavigatingArgCS__Group_0_1_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                    // InternalOCLinEcore.g:5717:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                    }
                    // InternalOCLinEcore.g:5718:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                    // InternalOCLinEcore.g:5718:2: rule__NavigatingArgCS__Group_0_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5722:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:5722:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                    // InternalOCLinEcore.g:5723:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                    }
                    // InternalOCLinEcore.g:5724:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                    // InternalOCLinEcore.g:5724:2: rule__NavigatingArgCS__Group_0_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Alternatives_0_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Alternatives_2"
    // InternalOCLinEcore.g:5733:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
    public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5737:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
            int alt68=3;
            switch ( input.LA(1) ) {
            case 113:
                {
                int LA68_1 = input.LA(2);

                if ( (synpred212_InternalOCLinEcore()) ) {
                    alt68=1;
                }
                else if ( (true) ) {
                    alt68=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 68, 1, input);

                    throw nvae;
                }
                }
                break;
            case 104:
                {
                int LA68_2 = input.LA(2);

                if ( (synpred213_InternalOCLinEcore()) ) {
                    alt68=2;
                }
                else if ( (true) ) {
                    alt68=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 68, 2, input);

                    throw nvae;
                }
                }
                break;
            case 119:
                {
                alt68=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 68, 0, input);

                throw nvae;
            }

            switch (alt68) {
                case 1 :
                    // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                    // InternalOCLinEcore.g:5739:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:5740:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                    // InternalOCLinEcore.g:5740:2: rule__NavigatingCommaArgCS__Group_2_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                    // InternalOCLinEcore.g:5745:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                    }
                    // InternalOCLinEcore.g:5746:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                    // InternalOCLinEcore.g:5746:2: rule__NavigatingCommaArgCS__Group_2_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5750:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                    {
                    // InternalOCLinEcore.g:5750:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                    // InternalOCLinEcore.g:5751:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                    }
                    // InternalOCLinEcore.g:5752:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                    // InternalOCLinEcore.g:5752:2: rule__NavigatingCommaArgCS__Group_2_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Alternatives_2"


    // $ANTLR start "rule__IfExpCS__OwnedConditionAlternatives_1_0"
    // InternalOCLinEcore.g:5761:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
    public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5765:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
            int alt69=2;
            alt69 = dfa69.predict(input);
            switch (alt69) {
                case 1 :
                    // InternalOCLinEcore.g:5766:1: ( ruleExpCS )
                    {
                    // InternalOCLinEcore.g:5766:1: ( ruleExpCS )
                    // InternalOCLinEcore.g:5767:1: ruleExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5772:6: ( rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:5772:6: ( rulePatternExpCS )
                    // InternalOCLinEcore.g:5773:1: rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePatternExpCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__OwnedConditionAlternatives_1_0"


    // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
    // InternalOCLinEcore.g:5783:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
    public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5787:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
            int alt70=2;
            int LA70_0 = input.LA(1);

            if ( (LA70_0==RULE_INT) ) {
                alt70=1;
            }
            else if ( (LA70_0==64||LA70_0==66||LA70_0==101) ) {
                alt70=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 70, 0, input);

                throw nvae;
            }
            switch (alt70) {
                case 1 :
                    // InternalOCLinEcore.g:5788:1: ( ruleMultiplicityBoundsCS )
                    {
                    // InternalOCLinEcore.g:5788:1: ( ruleMultiplicityBoundsCS )
                    // InternalOCLinEcore.g:5789:1: ruleMultiplicityBoundsCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleMultiplicityBoundsCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5794:6: ( ruleMultiplicityStringCS )
                    {
                    // InternalOCLinEcore.g:5794:6: ( ruleMultiplicityStringCS )
                    // InternalOCLinEcore.g:5795:1: ruleMultiplicityStringCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleMultiplicityStringCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Alternatives_1"


    // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
    // InternalOCLinEcore.g:5805:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
    public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5809:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
            int alt71=2;
            int LA71_0 = input.LA(1);

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

                throw nvae;
            }
            switch (alt71) {
                case 1 :
                    // InternalOCLinEcore.g:5810:1: ( '|?' )
                    {
                    // InternalOCLinEcore.g:5810:1: ( '|?' )
                    // InternalOCLinEcore.g:5811:1: '|?'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
                    }
                    match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5818:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                    {
                    // InternalOCLinEcore.g:5818:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                    // InternalOCLinEcore.g:5819:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                    }
                    // InternalOCLinEcore.g:5820:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                    // InternalOCLinEcore.g:5820:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__MultiplicityCS__IsNullFreeAssignment_2_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Alternatives_2"


    // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
    // InternalOCLinEcore.g:5829:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
    public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5833:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
            int alt72=3;
            switch ( input.LA(1) ) {
            case 64:
                {
                alt72=1;
                }
                break;
            case 66:
                {
                alt72=2;
                }
                break;
            case 101:
                {
                alt72=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 72, 0, input);

                throw nvae;
            }

            switch (alt72) {
                case 1 :
                    // InternalOCLinEcore.g:5834:1: ( '*' )
                    {
                    // InternalOCLinEcore.g:5834:1: ( '*' )
                    // InternalOCLinEcore.g:5835:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
                    }
                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5842:6: ( '+' )
                    {
                    // InternalOCLinEcore.g:5842:6: ( '+' )
                    // InternalOCLinEcore.g:5843:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
                    }
                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5850:6: ( '?' )
                    {
                    // InternalOCLinEcore.g:5850:6: ( '?' )
                    // InternalOCLinEcore.g:5851:1: '?'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
                    }
                    match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityStringCS__StringBoundsAlternatives_0"


    // $ANTLR start "rule__TypeRefCS__Alternatives"
    // InternalOCLinEcore.g:5863:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
    public final void rule__TypeRefCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5867:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
            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<=51)||(LA73_0>=54 && LA73_0<=60)||(LA73_0>=85 && LA73_0<=99)) ) {
                alt73=1;
            }
            else if ( (LA73_0==101) ) {
                alt73=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 73, 0, input);

                throw nvae;
            }
            switch (alt73) {
                case 1 :
                    // InternalOCLinEcore.g:5868:1: ( ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:5868:1: ( ruleTypedRefCS )
                    // InternalOCLinEcore.g:5869:1: ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5874:6: ( ruleWildcardTypeRefCS )
                    {
                    // InternalOCLinEcore.g:5874:6: ( ruleWildcardTypeRefCS )
                    // InternalOCLinEcore.g:5875:1: ruleWildcardTypeRefCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleWildcardTypeRefCS();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeRefCS__Alternatives"


    // $ANTLR start "rule__ID__Alternatives"
    // InternalOCLinEcore.g:5885:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
    public final void rule__ID__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5889:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( (LA74_0==RULE_SIMPLE_ID) ) {
                alt74=1;
            }
            else if ( (LA74_0==RULE_ESCAPED_ID) ) {
                alt74=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 74, 0, input);

                throw nvae;
            }
            switch (alt74) {
                case 1 :
                    // InternalOCLinEcore.g:5890:1: ( RULE_SIMPLE_ID )
                    {
                    // InternalOCLinEcore.g:5890:1: ( RULE_SIMPLE_ID )
                    // InternalOCLinEcore.g:5891:1: RULE_SIMPLE_ID
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
                    }
                    match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5896:6: ( RULE_ESCAPED_ID )
                    {
                    // InternalOCLinEcore.g:5896:6: ( RULE_ESCAPED_ID )
                    // InternalOCLinEcore.g:5897:1: RULE_ESCAPED_ID
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
                    }
                    match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ID__Alternatives"


    // $ANTLR start "rule__UPPER__Alternatives"
    // InternalOCLinEcore.g:5907:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
    public final void rule__UPPER__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5911:1: ( ( RULE_INT ) | ( '*' ) )
            int alt75=2;
            int LA75_0 = input.LA(1);

            if ( (LA75_0==RULE_INT) ) {
                alt75=1;
            }
            else if ( (LA75_0==64) ) {
                alt75=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 75, 0, input);

                throw nvae;
            }
            switch (alt75) {
                case 1 :
                    // InternalOCLinEcore.g:5912:1: ( RULE_INT )
                    {
                    // InternalOCLinEcore.g:5912:1: ( RULE_INT )
                    // InternalOCLinEcore.g:5913:1: RULE_INT
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
                    }
                    match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5918:6: ( '*' )
                    {
                    // InternalOCLinEcore.g:5918:6: ( '*' )
                    // InternalOCLinEcore.g:5919:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
                    }
                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UPPER__Alternatives"


    // $ANTLR start "rule__TopLevelCS__Group__0"
    // InternalOCLinEcore.g:5933:1: rule__TopLevelCS__Group__0 : rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 ;
    public final void rule__TopLevelCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5937:1: ( rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 )
            // InternalOCLinEcore.g:5938:2: rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_4);
            rule__TopLevelCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__0"


    // $ANTLR start "rule__TopLevelCS__Group__0__Impl"
    // InternalOCLinEcore.g:5945:1: rule__TopLevelCS__Group__0__Impl : ( () ) ;
    public final void rule__TopLevelCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5949:1: ( ( () ) )
            // InternalOCLinEcore.g:5950:1: ( () )
            {
            // InternalOCLinEcore.g:5950:1: ( () )
            // InternalOCLinEcore.g:5951:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getTopLevelCSAction_0());
            }
            // InternalOCLinEcore.g:5952:1: ()
            // InternalOCLinEcore.g:5954:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getTopLevelCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__0__Impl"


    // $ANTLR start "rule__TopLevelCS__Group__1"
    // InternalOCLinEcore.g:5964:1: rule__TopLevelCS__Group__1 : rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 ;
    public final void rule__TopLevelCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5968:1: ( rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 )
            // InternalOCLinEcore.g:5969:2: rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_4);
            rule__TopLevelCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__1"


    // $ANTLR start "rule__TopLevelCS__Group__1__Impl"
    // InternalOCLinEcore.g:5976:1: rule__TopLevelCS__Group__1__Impl : ( ( rule__TopLevelCS__Group_1__0 )? ) ;
    public final void rule__TopLevelCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5980:1: ( ( ( rule__TopLevelCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:5981:1: ( ( rule__TopLevelCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:5981:1: ( ( rule__TopLevelCS__Group_1__0 )? )
            // InternalOCLinEcore.g:5982:1: ( rule__TopLevelCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:5983:1: ( rule__TopLevelCS__Group_1__0 )?
            int alt76=2;
            int LA76_0 = input.LA(1);

            if ( (LA76_0==35) ) {
                alt76=1;
            }
            switch (alt76) {
                case 1 :
                    // InternalOCLinEcore.g:5983:2: rule__TopLevelCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TopLevelCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__1__Impl"


    // $ANTLR start "rule__TopLevelCS__Group__2"
    // InternalOCLinEcore.g:5993:1: rule__TopLevelCS__Group__2 : rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 ;
    public final void rule__TopLevelCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5997:1: ( rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 )
            // InternalOCLinEcore.g:5998:2: rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_4);
            rule__TopLevelCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__2"


    // $ANTLR start "rule__TopLevelCS__Group__2__Impl"
    // InternalOCLinEcore.g:6005:1: rule__TopLevelCS__Group__2__Impl : ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) ;
    public final void rule__TopLevelCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6009:1: ( ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) )
            // InternalOCLinEcore.g:6010:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
            {
            // InternalOCLinEcore.g:6010:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
            // InternalOCLinEcore.g:6011:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedImportsAssignment_2());
            }
            // InternalOCLinEcore.g:6012:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
            loop77:
            do {
                int alt77=2;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==30||LA77_0==34) ) {
                    alt77=1;
                }


                switch (alt77) {
            	case 1 :
            	    // InternalOCLinEcore.g:6012:2: rule__TopLevelCS__OwnedImportsAssignment_2
            	    {
            	    pushFollow(FollowSets000.FOLLOW_5);
            	    rule__TopLevelCS__OwnedImportsAssignment_2();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getOwnedImportsAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__2__Impl"


    // $ANTLR start "rule__TopLevelCS__Group__3"
    // InternalOCLinEcore.g:6022:1: rule__TopLevelCS__Group__3 : rule__TopLevelCS__Group__3__Impl ;
    public final void rule__TopLevelCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6026:1: ( rule__TopLevelCS__Group__3__Impl )
            // InternalOCLinEcore.g:6027:2: rule__TopLevelCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__3"


    // $ANTLR start "rule__TopLevelCS__Group__3__Impl"
    // InternalOCLinEcore.g:6033:1: rule__TopLevelCS__Group__3__Impl : ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) ;
    public final void rule__TopLevelCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6037:1: ( ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) )
            // InternalOCLinEcore.g:6038:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
            {
            // InternalOCLinEcore.g:6038:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
            // InternalOCLinEcore.g:6039:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedPackagesAssignment_3());
            }
            // InternalOCLinEcore.g:6040:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
            loop78:
            do {
                int alt78=2;
                int LA78_0 = input.LA(1);

                if ( (LA78_0==38) ) {
                    alt78=1;
                }


                switch (alt78) {
            	case 1 :
            	    // InternalOCLinEcore.g:6040:2: rule__TopLevelCS__OwnedPackagesAssignment_3
            	    {
            	    pushFollow(FollowSets000.FOLLOW_6);
            	    rule__TopLevelCS__OwnedPackagesAssignment_3();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getOwnedPackagesAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group__3__Impl"


    // $ANTLR start "rule__TopLevelCS__Group_1__0"
    // InternalOCLinEcore.g:6058:1: rule__TopLevelCS__Group_1__0 : rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 ;
    public final void rule__TopLevelCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6062:1: ( rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 )
            // InternalOCLinEcore.g:6063:2: rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TopLevelCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group_1__0"


    // $ANTLR start "rule__TopLevelCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:6070:1: rule__TopLevelCS__Group_1__0__Impl : ( 'module' ) ;
    public final void rule__TopLevelCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6074:1: ( ( 'module' ) )
            // InternalOCLinEcore.g:6075:1: ( 'module' )
            {
            // InternalOCLinEcore.g:6075:1: ( 'module' )
            // InternalOCLinEcore.g:6076:1: 'module'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getModuleKeyword_1_0());
            }
            match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getModuleKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group_1__0__Impl"


    // $ANTLR start "rule__TopLevelCS__Group_1__1"
    // InternalOCLinEcore.g:6089:1: rule__TopLevelCS__Group_1__1 : rule__TopLevelCS__Group_1__1__Impl ;
    public final void rule__TopLevelCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6093:1: ( rule__TopLevelCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:6094:2: rule__TopLevelCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TopLevelCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group_1__1"


    // $ANTLR start "rule__TopLevelCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:6100:1: rule__TopLevelCS__Group_1__1__Impl : ( ruleUnrestrictedName ) ;
    public final void rule__TopLevelCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6104:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:6105:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:6105:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:6106:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getUnrestrictedNameParserRuleCall_1_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getUnrestrictedNameParserRuleCall_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__Group_1__1__Impl"


    // $ANTLR start "rule__SIGNED__Group__0"
    // InternalOCLinEcore.g:6121:1: rule__SIGNED__Group__0 : rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 ;
    public final void rule__SIGNED__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6125:1: ( rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 )
            // InternalOCLinEcore.g:6126:2: rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_8);
            rule__SIGNED__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SIGNED__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SIGNED__Group__0"


    // $ANTLR start "rule__SIGNED__Group__0__Impl"
    // InternalOCLinEcore.g:6133:1: rule__SIGNED__Group__0__Impl : ( ( '-' )? ) ;
    public final void rule__SIGNED__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6137:1: ( ( ( '-' )? ) )
            // InternalOCLinEcore.g:6138:1: ( ( '-' )? )
            {
            // InternalOCLinEcore.g:6138:1: ( ( '-' )? )
            // InternalOCLinEcore.g:6139:1: ( '-' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());
            }
            // InternalOCLinEcore.g:6140:1: ( '-' )?
            int alt79=2;
            int LA79_0 = input.LA(1);

            if ( (LA79_0==61) ) {
                alt79=1;
            }
            switch (alt79) {
                case 1 :
                    // InternalOCLinEcore.g:6141:2: '-'
                    {
                    match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SIGNED__Group__0__Impl"


    // $ANTLR start "rule__SIGNED__Group__1"
    // InternalOCLinEcore.g:6152:1: rule__SIGNED__Group__1 : rule__SIGNED__Group__1__Impl ;
    public final void rule__SIGNED__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6156:1: ( rule__SIGNED__Group__1__Impl )
            // InternalOCLinEcore.g:6157:2: rule__SIGNED__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SIGNED__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SIGNED__Group__1"


    // $ANTLR start "rule__SIGNED__Group__1__Impl"
    // InternalOCLinEcore.g:6163:1: rule__SIGNED__Group__1__Impl : ( RULE_INT ) ;
    public final void rule__SIGNED__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6167:1: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:6168:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:6168:1: ( RULE_INT )
            // InternalOCLinEcore.g:6169:1: RULE_INT
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSIGNEDAccess().getINTTerminalRuleCall_1());
            }
            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSIGNEDAccess().getINTTerminalRuleCall_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SIGNED__Group__1__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group__0"
    // InternalOCLinEcore.g:6184:1: rule__InvariantConstraintCS__Group__0 : rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 ;
    public final void rule__InvariantConstraintCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6188:1: ( rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 )
            // InternalOCLinEcore.g:6189:2: rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_9);
            rule__InvariantConstraintCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__0"


    // $ANTLR start "rule__InvariantConstraintCS__Group__0__Impl"
    // InternalOCLinEcore.g:6196:1: rule__InvariantConstraintCS__Group__0__Impl : ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) ;
    public final void rule__InvariantConstraintCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6200:1: ( ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) )
            // InternalOCLinEcore.g:6201:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
            {
            // InternalOCLinEcore.g:6201:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
            // InternalOCLinEcore.g:6202:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableAssignment_0());
            }
            // InternalOCLinEcore.g:6203:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==20) ) {
                alt80=1;
            }
            switch (alt80) {
                case 1 :
                    // InternalOCLinEcore.g:6203:2: rule__InvariantConstraintCS__IsCallableAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__InvariantConstraintCS__IsCallableAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getIsCallableAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__0__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group__1"
    // InternalOCLinEcore.g:6213:1: rule__InvariantConstraintCS__Group__1 : rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 ;
    public final void rule__InvariantConstraintCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6217:1: ( rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6218:2: rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_10);
            rule__InvariantConstraintCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__1"


    // $ANTLR start "rule__InvariantConstraintCS__Group__1__Impl"
    // InternalOCLinEcore.g:6225:1: rule__InvariantConstraintCS__Group__1__Impl : ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) ;
    public final void rule__InvariantConstraintCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6229:1: ( ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) )
            // InternalOCLinEcore.g:6230:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
            {
            // InternalOCLinEcore.g:6230:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
            // InternalOCLinEcore.g:6231:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeAssignment_1());
            }
            // InternalOCLinEcore.g:6232:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
            // InternalOCLinEcore.g:6232:2: rule__InvariantConstraintCS__StereotypeAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__StereotypeAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getStereotypeAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__1__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group__2"
    // InternalOCLinEcore.g:6242:1: rule__InvariantConstraintCS__Group__2 : rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 ;
    public final void rule__InvariantConstraintCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6246:1: ( rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6247:2: rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_10);
            rule__InvariantConstraintCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__2"


    // $ANTLR start "rule__InvariantConstraintCS__Group__2__Impl"
    // InternalOCLinEcore.g:6254:1: rule__InvariantConstraintCS__Group__2__Impl : ( ( rule__InvariantConstraintCS__Group_2__0 )? ) ;
    public final void rule__InvariantConstraintCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6258:1: ( ( ( rule__InvariantConstraintCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:6259:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:6259:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
            // InternalOCLinEcore.g:6260:1: ( rule__InvariantConstraintCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:6261:1: ( rule__InvariantConstraintCS__Group_2__0 )?
            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<=51)||(LA81_0>=54 && LA81_0<=60)) ) {
                alt81=1;
            }
            switch (alt81) {
                case 1 :
                    // InternalOCLinEcore.g:6261:2: rule__InvariantConstraintCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__InvariantConstraintCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__2__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group__3"
    // InternalOCLinEcore.g:6271:1: rule__InvariantConstraintCS__Group__3 : rule__InvariantConstraintCS__Group__3__Impl ;
    public final void rule__InvariantConstraintCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6275:1: ( rule__InvariantConstraintCS__Group__3__Impl )
            // InternalOCLinEcore.g:6276:2: rule__InvariantConstraintCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__3"


    // $ANTLR start "rule__InvariantConstraintCS__Group__3__Impl"
    // InternalOCLinEcore.g:6282:1: rule__InvariantConstraintCS__Group__3__Impl : ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) ;
    public final void rule__InvariantConstraintCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6286:1: ( ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) )
            // InternalOCLinEcore.g:6287:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
            {
            // InternalOCLinEcore.g:6287:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
            // InternalOCLinEcore.g:6288:1: ( rule__InvariantConstraintCS__Alternatives_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getAlternatives_3());
            }
            // InternalOCLinEcore.g:6289:1: ( rule__InvariantConstraintCS__Alternatives_3 )
            // InternalOCLinEcore.g:6289:2: rule__InvariantConstraintCS__Alternatives_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Alternatives_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getAlternatives_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group__3__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2__0"
    // InternalOCLinEcore.g:6307:1: rule__InvariantConstraintCS__Group_2__0 : rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 ;
    public final void rule__InvariantConstraintCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6311:1: ( rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 )
            // InternalOCLinEcore.g:6312:2: rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__InvariantConstraintCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2__0"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:6319:1: rule__InvariantConstraintCS__Group_2__0__Impl : ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) ;
    public final void rule__InvariantConstraintCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6323:1: ( ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:6324:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:6324:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
            // InternalOCLinEcore.g:6325:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getNameAssignment_2_0());
            }
            // InternalOCLinEcore.g:6326:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
            // InternalOCLinEcore.g:6326:2: rule__InvariantConstraintCS__NameAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__NameAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getNameAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2__0__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2__1"
    // InternalOCLinEcore.g:6336:1: rule__InvariantConstraintCS__Group_2__1 : rule__InvariantConstraintCS__Group_2__1__Impl ;
    public final void rule__InvariantConstraintCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6340:1: ( rule__InvariantConstraintCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:6341:2: rule__InvariantConstraintCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2__1"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:6347:1: rule__InvariantConstraintCS__Group_2__1__Impl : ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) ;
    public final void rule__InvariantConstraintCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6351:1: ( ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) )
            // InternalOCLinEcore.g:6352:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
            {
            // InternalOCLinEcore.g:6352:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
            // InternalOCLinEcore.g:6353:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:6354:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
            int alt82=2;
            int LA82_0 = input.LA(1);

            if ( (LA82_0==102) ) {
                alt82=1;
            }
            switch (alt82) {
                case 1 :
                    // InternalOCLinEcore.g:6354:2: rule__InvariantConstraintCS__Group_2_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__InvariantConstraintCS__Group_2_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getGroup_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2__1__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__0"
    // InternalOCLinEcore.g:6368:1: rule__InvariantConstraintCS__Group_2_1__0 : rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 ;
    public final void rule__InvariantConstraintCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6372:1: ( rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 )
            // InternalOCLinEcore.g:6373:2: rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_12);
            rule__InvariantConstraintCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__0"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:6380:1: rule__InvariantConstraintCS__Group_2_1__0__Impl : ( '(' ) ;
    public final void rule__InvariantConstraintCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6384:1: ( ( '(' ) )
            // InternalOCLinEcore.g:6385:1: ( '(' )
            {
            // InternalOCLinEcore.g:6385:1: ( '(' )
            // InternalOCLinEcore.g:6386:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getLeftParenthesisKeyword_2_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getLeftParenthesisKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__1"
    // InternalOCLinEcore.g:6399:1: rule__InvariantConstraintCS__Group_2_1__1 : rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 ;
    public final void rule__InvariantConstraintCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6403:1: ( rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 )
            // InternalOCLinEcore.g:6404:2: rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__InvariantConstraintCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_2_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__1"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:6411:1: rule__InvariantConstraintCS__Group_2_1__1__Impl : ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) ;
    public final void rule__InvariantConstraintCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6415:1: ( ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:6416:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:6416:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:6417:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:6418:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
            // InternalOCLinEcore.g:6418:2: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__2"
    // InternalOCLinEcore.g:6428:1: rule__InvariantConstraintCS__Group_2_1__2 : rule__InvariantConstraintCS__Group_2_1__2__Impl ;
    public final void rule__InvariantConstraintCS__Group_2_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6432:1: ( rule__InvariantConstraintCS__Group_2_1__2__Impl )
            // InternalOCLinEcore.g:6433:2: rule__InvariantConstraintCS__Group_2_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_2_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__2"


    // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__2__Impl"
    // InternalOCLinEcore.g:6439:1: rule__InvariantConstraintCS__Group_2_1__2__Impl : ( ')' ) ;
    public final void rule__InvariantConstraintCS__Group_2_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6443:1: ( ( ')' ) )
            // InternalOCLinEcore.g:6444:1: ( ')' )
            {
            // InternalOCLinEcore.g:6444:1: ( ')' )
            // InternalOCLinEcore.g:6445:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getRightParenthesisKeyword_2_1_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getRightParenthesisKeyword_2_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_2_1__2__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__0"
    // InternalOCLinEcore.g:6464:1: rule__InvariantConstraintCS__Group_3_0__0 : rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 ;
    public final void rule__InvariantConstraintCS__Group_3_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6468:1: ( rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 )
            // InternalOCLinEcore.g:6469:2: rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__InvariantConstraintCS__Group_3_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_3_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__0"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__0__Impl"
    // InternalOCLinEcore.g:6476:1: rule__InvariantConstraintCS__Group_3_0__0__Impl : ( ':' ) ;
    public final void rule__InvariantConstraintCS__Group_3_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6480:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6481:1: ( ':' )
            {
            // InternalOCLinEcore.g:6481:1: ( ':' )
            // InternalOCLinEcore.g:6482:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getColonKeyword_3_0_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getColonKeyword_3_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__0__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__1"
    // InternalOCLinEcore.g:6495:1: rule__InvariantConstraintCS__Group_3_0__1 : rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 ;
    public final void rule__InvariantConstraintCS__Group_3_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6499:1: ( rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 )
            // InternalOCLinEcore.g:6500:2: rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__InvariantConstraintCS__Group_3_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_3_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__1"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__1__Impl"
    // InternalOCLinEcore.g:6507:1: rule__InvariantConstraintCS__Group_3_0__1__Impl : ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) ;
    public final void rule__InvariantConstraintCS__Group_3_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6511:1: ( ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) )
            // InternalOCLinEcore.g:6512:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
            {
            // InternalOCLinEcore.g:6512:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
            // InternalOCLinEcore.g:6513:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationAssignment_3_0_1());
            }
            // InternalOCLinEcore.g:6514:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( ((LA83_0>=RULE_INT && LA83_0<=RULE_SINGLE_QUOTED_STRING)||(LA83_0>=RULE_SIMPLE_ID && LA83_0<=RULE_UNQUOTED_STRING)||(LA83_0>=17 && LA83_0<=51)||(LA83_0>=54 && LA83_0<=64)||(LA83_0>=85 && LA83_0<=99)||LA83_0==102||LA83_0==112||(LA83_0>=114 && LA83_0<=115)||LA83_0==120||(LA83_0>=125 && LA83_0<=126)||(LA83_0>=139 && LA83_0<=140)) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalOCLinEcore.g:6514:2: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationAssignment_3_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__1__Impl"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__2"
    // InternalOCLinEcore.g:6524:1: rule__InvariantConstraintCS__Group_3_0__2 : rule__InvariantConstraintCS__Group_3_0__2__Impl ;
    public final void rule__InvariantConstraintCS__Group_3_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6528:1: ( rule__InvariantConstraintCS__Group_3_0__2__Impl )
            // InternalOCLinEcore.g:6529:2: rule__InvariantConstraintCS__Group_3_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvariantConstraintCS__Group_3_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__2"


    // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__2__Impl"
    // InternalOCLinEcore.g:6535:1: rule__InvariantConstraintCS__Group_3_0__2__Impl : ( ';' ) ;
    public final void rule__InvariantConstraintCS__Group_3_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6539:1: ( ( ';' ) )
            // InternalOCLinEcore.g:6540:1: ( ';' )
            {
            // InternalOCLinEcore.g:6540:1: ( ';' )
            // InternalOCLinEcore.g:6541:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_0_2());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__Group_3_0__2__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__0"
    // InternalOCLinEcore.g:6560:1: rule__PostconditionConstraintCS__Group__0 : rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 ;
    public final void rule__PostconditionConstraintCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6564:1: ( rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 )
            // InternalOCLinEcore.g:6565:2: rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__PostconditionConstraintCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__0"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__0__Impl"
    // InternalOCLinEcore.g:6572:1: rule__PostconditionConstraintCS__Group__0__Impl : ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) ;
    public final void rule__PostconditionConstraintCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6576:1: ( ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:6577:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:6577:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
            // InternalOCLinEcore.g:6578:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypeAssignment_0());
            }
            // InternalOCLinEcore.g:6579:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
            // InternalOCLinEcore.g:6579:2: rule__PostconditionConstraintCS__StereotypeAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__StereotypeAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getStereotypeAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__0__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__1"
    // InternalOCLinEcore.g:6589:1: rule__PostconditionConstraintCS__Group__1 : rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 ;
    public final void rule__PostconditionConstraintCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6593:1: ( rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6594:2: rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__PostconditionConstraintCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__1"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__1__Impl"
    // InternalOCLinEcore.g:6601:1: rule__PostconditionConstraintCS__Group__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) ;
    public final void rule__PostconditionConstraintCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6605:1: ( ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:6606:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:6606:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
            // InternalOCLinEcore.g:6607:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:6608:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( ((LA84_0>=RULE_SIMPLE_ID && LA84_0<=RULE_ESCAPED_ID)||(LA84_0>=17 && LA84_0<=51)||(LA84_0>=54 && LA84_0<=60)) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // InternalOCLinEcore.g:6608:2: rule__PostconditionConstraintCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PostconditionConstraintCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__1__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__2"
    // InternalOCLinEcore.g:6618:1: rule__PostconditionConstraintCS__Group__2 : rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 ;
    public final void rule__PostconditionConstraintCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6622:1: ( rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6623:2: rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__PostconditionConstraintCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__2"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__2__Impl"
    // InternalOCLinEcore.g:6630:1: rule__PostconditionConstraintCS__Group__2__Impl : ( ':' ) ;
    public final void rule__PostconditionConstraintCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6634:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6635:1: ( ':' )
            {
            // InternalOCLinEcore.g:6635:1: ( ':' )
            // InternalOCLinEcore.g:6636:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getColonKeyword_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getColonKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__2__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__3"
    // InternalOCLinEcore.g:6649:1: rule__PostconditionConstraintCS__Group__3 : rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 ;
    public final void rule__PostconditionConstraintCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6653:1: ( rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 )
            // InternalOCLinEcore.g:6654:2: rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__PostconditionConstraintCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__3"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__3__Impl"
    // InternalOCLinEcore.g:6661:1: rule__PostconditionConstraintCS__Group__3__Impl : ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
    public final void rule__PostconditionConstraintCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6665:1: ( ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
            // InternalOCLinEcore.g:6666:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            {
            // InternalOCLinEcore.g:6666:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            // InternalOCLinEcore.g:6667:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }
            // InternalOCLinEcore.g:6668:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            int alt85=2;
            int LA85_0 = input.LA(1);

            if ( ((LA85_0>=RULE_INT && LA85_0<=RULE_SINGLE_QUOTED_STRING)||(LA85_0>=RULE_SIMPLE_ID && LA85_0<=RULE_UNQUOTED_STRING)||(LA85_0>=17 && LA85_0<=51)||(LA85_0>=54 && LA85_0<=64)||(LA85_0>=85 && LA85_0<=99)||LA85_0==102||LA85_0==112||(LA85_0>=114 && LA85_0<=115)||LA85_0==120||(LA85_0>=125 && LA85_0<=126)||(LA85_0>=139 && LA85_0<=140)) ) {
                alt85=1;
            }
            switch (alt85) {
                case 1 :
                    // InternalOCLinEcore.g:6668:2: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__3__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__4"
    // InternalOCLinEcore.g:6678:1: rule__PostconditionConstraintCS__Group__4 : rule__PostconditionConstraintCS__Group__4__Impl ;
    public final void rule__PostconditionConstraintCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6682:1: ( rule__PostconditionConstraintCS__Group__4__Impl )
            // InternalOCLinEcore.g:6683:2: rule__PostconditionConstraintCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__4"


    // $ANTLR start "rule__PostconditionConstraintCS__Group__4__Impl"
    // InternalOCLinEcore.g:6689:1: rule__PostconditionConstraintCS__Group__4__Impl : ( ';' ) ;
    public final void rule__PostconditionConstraintCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6693:1: ( ( ';' ) )
            // InternalOCLinEcore.g:6694:1: ( ';' )
            {
            // InternalOCLinEcore.g:6694:1: ( ';' )
            // InternalOCLinEcore.g:6695:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getSemicolonKeyword_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getSemicolonKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group__4__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1__0"
    // InternalOCLinEcore.g:6718:1: rule__PostconditionConstraintCS__Group_1__0 : rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 ;
    public final void rule__PostconditionConstraintCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6722:1: ( rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 )
            // InternalOCLinEcore.g:6723:2: rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__PostconditionConstraintCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1__0"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:6730:1: rule__PostconditionConstraintCS__Group_1__0__Impl : ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) ;
    public final void rule__PostconditionConstraintCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6734:1: ( ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:6735:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:6735:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:6736:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:6737:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:6737:2: rule__PostconditionConstraintCS__NameAssignment_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__NameAssignment_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getNameAssignment_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1__0__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1__1"
    // InternalOCLinEcore.g:6747:1: rule__PostconditionConstraintCS__Group_1__1 : rule__PostconditionConstraintCS__Group_1__1__Impl ;
    public final void rule__PostconditionConstraintCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6751:1: ( rule__PostconditionConstraintCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:6752:2: rule__PostconditionConstraintCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1__1"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:6758:1: rule__PostconditionConstraintCS__Group_1__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) ;
    public final void rule__PostconditionConstraintCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6762:1: ( ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:6763:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:6763:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:6764:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:6765:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
            int alt86=2;
            int LA86_0 = input.LA(1);

            if ( (LA86_0==102) ) {
                alt86=1;
            }
            switch (alt86) {
                case 1 :
                    // InternalOCLinEcore.g:6765:2: rule__PostconditionConstraintCS__Group_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PostconditionConstraintCS__Group_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1__1__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__0"
    // InternalOCLinEcore.g:6779:1: rule__PostconditionConstraintCS__Group_1_1__0 : rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 ;
    public final void rule__PostconditionConstraintCS__Group_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6783:1: ( rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 )
            // InternalOCLinEcore.g:6784:2: rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_12);
            rule__PostconditionConstraintCS__Group_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__0"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__0__Impl"
    // InternalOCLinEcore.g:6791:1: rule__PostconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
    public final void rule__PostconditionConstraintCS__Group_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6795:1: ( ( '(' ) )
            // InternalOCLinEcore.g:6796:1: ( '(' )
            {
            // InternalOCLinEcore.g:6796:1: ( '(' )
            // InternalOCLinEcore.g:6797:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__0__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__1"
    // InternalOCLinEcore.g:6810:1: rule__PostconditionConstraintCS__Group_1_1__1 : rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 ;
    public final void rule__PostconditionConstraintCS__Group_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6814:1: ( rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 )
            // InternalOCLinEcore.g:6815:2: rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__PostconditionConstraintCS__Group_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__1"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__1__Impl"
    // InternalOCLinEcore.g:6822:1: rule__PostconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
    public final void rule__PostconditionConstraintCS__Group_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6826:1: ( ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:6827:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:6827:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:6828:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:6829:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            // InternalOCLinEcore.g:6829:2: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__1__Impl"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__2"
    // InternalOCLinEcore.g:6839:1: rule__PostconditionConstraintCS__Group_1_1__2 : rule__PostconditionConstraintCS__Group_1_1__2__Impl ;
    public final void rule__PostconditionConstraintCS__Group_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6843:1: ( rule__PostconditionConstraintCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:6844:2: rule__PostconditionConstraintCS__Group_1_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PostconditionConstraintCS__Group_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__2"


    // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__2__Impl"
    // InternalOCLinEcore.g:6850:1: rule__PostconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
    public final void rule__PostconditionConstraintCS__Group_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6854:1: ( ( ')' ) )
            // InternalOCLinEcore.g:6855:1: ( ')' )
            {
            // InternalOCLinEcore.g:6855:1: ( ')' )
            // InternalOCLinEcore.g:6856:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__Group_1_1__2__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__0"
    // InternalOCLinEcore.g:6875:1: rule__PreconditionConstraintCS__Group__0 : rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 ;
    public final void rule__PreconditionConstraintCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6879:1: ( rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 )
            // InternalOCLinEcore.g:6880:2: rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__PreconditionConstraintCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__0"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__0__Impl"
    // InternalOCLinEcore.g:6887:1: rule__PreconditionConstraintCS__Group__0__Impl : ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) ;
    public final void rule__PreconditionConstraintCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6891:1: ( ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:6892:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:6892:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
            // InternalOCLinEcore.g:6893:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypeAssignment_0());
            }
            // InternalOCLinEcore.g:6894:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
            // InternalOCLinEcore.g:6894:2: rule__PreconditionConstraintCS__StereotypeAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__StereotypeAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getStereotypeAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__0__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__1"
    // InternalOCLinEcore.g:6904:1: rule__PreconditionConstraintCS__Group__1 : rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 ;
    public final void rule__PreconditionConstraintCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6908:1: ( rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6909:2: rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__PreconditionConstraintCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__1"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__1__Impl"
    // InternalOCLinEcore.g:6916:1: rule__PreconditionConstraintCS__Group__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) ;
    public final void rule__PreconditionConstraintCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6920:1: ( ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:6921:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:6921:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
            // InternalOCLinEcore.g:6922:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:6923:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
            int alt87=2;
            int LA87_0 = input.LA(1);

            if ( ((LA87_0>=RULE_SIMPLE_ID && LA87_0<=RULE_ESCAPED_ID)||(LA87_0>=17 && LA87_0<=51)||(LA87_0>=54 && LA87_0<=60)) ) {
                alt87=1;
            }
            switch (alt87) {
                case 1 :
                    // InternalOCLinEcore.g:6923:2: rule__PreconditionConstraintCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PreconditionConstraintCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__1__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__2"
    // InternalOCLinEcore.g:6933:1: rule__PreconditionConstraintCS__Group__2 : rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 ;
    public final void rule__PreconditionConstraintCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6937:1: ( rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6938:2: rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__PreconditionConstraintCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__2"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__2__Impl"
    // InternalOCLinEcore.g:6945:1: rule__PreconditionConstraintCS__Group__2__Impl : ( ':' ) ;
    public final void rule__PreconditionConstraintCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6949:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6950:1: ( ':' )
            {
            // InternalOCLinEcore.g:6950:1: ( ':' )
            // InternalOCLinEcore.g:6951:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getColonKeyword_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getColonKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__2__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__3"
    // InternalOCLinEcore.g:6964:1: rule__PreconditionConstraintCS__Group__3 : rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 ;
    public final void rule__PreconditionConstraintCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6968:1: ( rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 )
            // InternalOCLinEcore.g:6969:2: rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__PreconditionConstraintCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__3"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__3__Impl"
    // InternalOCLinEcore.g:6976:1: rule__PreconditionConstraintCS__Group__3__Impl : ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
    public final void rule__PreconditionConstraintCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6980:1: ( ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
            // InternalOCLinEcore.g:6981:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            {
            // InternalOCLinEcore.g:6981:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            // InternalOCLinEcore.g:6982:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }
            // InternalOCLinEcore.g:6983:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( ((LA88_0>=RULE_INT && LA88_0<=RULE_SINGLE_QUOTED_STRING)||(LA88_0>=RULE_SIMPLE_ID && LA88_0<=RULE_UNQUOTED_STRING)||(LA88_0>=17 && LA88_0<=51)||(LA88_0>=54 && LA88_0<=64)||(LA88_0>=85 && LA88_0<=99)||LA88_0==102||LA88_0==112||(LA88_0>=114 && LA88_0<=115)||LA88_0==120||(LA88_0>=125 && LA88_0<=126)||(LA88_0>=139 && LA88_0<=140)) ) {
                alt88=1;
            }
            switch (alt88) {
                case 1 :
                    // InternalOCLinEcore.g:6983:2: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__3__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__4"
    // InternalOCLinEcore.g:6993:1: rule__PreconditionConstraintCS__Group__4 : rule__PreconditionConstraintCS__Group__4__Impl ;
    public final void rule__PreconditionConstraintCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6997:1: ( rule__PreconditionConstraintCS__Group__4__Impl )
            // InternalOCLinEcore.g:6998:2: rule__PreconditionConstraintCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__4"


    // $ANTLR start "rule__PreconditionConstraintCS__Group__4__Impl"
    // InternalOCLinEcore.g:7004:1: rule__PreconditionConstraintCS__Group__4__Impl : ( ';' ) ;
    public final void rule__PreconditionConstraintCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7008:1: ( ( ';' ) )
            // InternalOCLinEcore.g:7009:1: ( ';' )
            {
            // InternalOCLinEcore.g:7009:1: ( ';' )
            // InternalOCLinEcore.g:7010:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getSemicolonKeyword_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getSemicolonKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group__4__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1__0"
    // InternalOCLinEcore.g:7033:1: rule__PreconditionConstraintCS__Group_1__0 : rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 ;
    public final void rule__PreconditionConstraintCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7037:1: ( rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 )
            // InternalOCLinEcore.g:7038:2: rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__PreconditionConstraintCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1__0"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:7045:1: rule__PreconditionConstraintCS__Group_1__0__Impl : ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) ;
    public final void rule__PreconditionConstraintCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7049:1: ( ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:7050:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:7050:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:7051:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:7052:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:7052:2: rule__PreconditionConstraintCS__NameAssignment_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__NameAssignment_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getNameAssignment_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1__0__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1__1"
    // InternalOCLinEcore.g:7062:1: rule__PreconditionConstraintCS__Group_1__1 : rule__PreconditionConstraintCS__Group_1__1__Impl ;
    public final void rule__PreconditionConstraintCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7066:1: ( rule__PreconditionConstraintCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:7067:2: rule__PreconditionConstraintCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1__1"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:7073:1: rule__PreconditionConstraintCS__Group_1__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) ;
    public final void rule__PreconditionConstraintCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7077:1: ( ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:7078:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:7078:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:7079:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:7080:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==102) ) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // InternalOCLinEcore.g:7080:2: rule__PreconditionConstraintCS__Group_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PreconditionConstraintCS__Group_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1__1__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__0"
    // InternalOCLinEcore.g:7094:1: rule__PreconditionConstraintCS__Group_1_1__0 : rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 ;
    public final void rule__PreconditionConstraintCS__Group_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7098:1: ( rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 )
            // InternalOCLinEcore.g:7099:2: rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_12);
            rule__PreconditionConstraintCS__Group_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__0"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__0__Impl"
    // InternalOCLinEcore.g:7106:1: rule__PreconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
    public final void rule__PreconditionConstraintCS__Group_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7110:1: ( ( '(' ) )
            // InternalOCLinEcore.g:7111:1: ( '(' )
            {
            // InternalOCLinEcore.g:7111:1: ( '(' )
            // InternalOCLinEcore.g:7112:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__0__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__1"
    // InternalOCLinEcore.g:7125:1: rule__PreconditionConstraintCS__Group_1_1__1 : rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 ;
    public final void rule__PreconditionConstraintCS__Group_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7129:1: ( rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 )
            // InternalOCLinEcore.g:7130:2: rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__PreconditionConstraintCS__Group_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__1"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__1__Impl"
    // InternalOCLinEcore.g:7137:1: rule__PreconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
    public final void rule__PreconditionConstraintCS__Group_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7141:1: ( ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:7142:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:7142:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:7143:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:7144:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            // InternalOCLinEcore.g:7144:2: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__1__Impl"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__2"
    // InternalOCLinEcore.g:7154:1: rule__PreconditionConstraintCS__Group_1_1__2 : rule__PreconditionConstraintCS__Group_1_1__2__Impl ;
    public final void rule__PreconditionConstraintCS__Group_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7158:1: ( rule__PreconditionConstraintCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:7159:2: rule__PreconditionConstraintCS__Group_1_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PreconditionConstraintCS__Group_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__2"


    // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__2__Impl"
    // InternalOCLinEcore.g:7165:1: rule__PreconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
    public final void rule__PreconditionConstraintCS__Group_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7169:1: ( ( ')' ) )
            // InternalOCLinEcore.g:7170:1: ( ')' )
            {
            // InternalOCLinEcore.g:7170:1: ( ')' )
            // InternalOCLinEcore.g:7171:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__Group_1_1__2__Impl"


    // $ANTLR start "rule__AnnotationCS__Group__0"
    // InternalOCLinEcore.g:7190:1: rule__AnnotationCS__Group__0 : rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 ;
    public final void rule__AnnotationCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7194:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
            // InternalOCLinEcore.g:7195:2: rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_16);
            rule__AnnotationCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__0"


    // $ANTLR start "rule__AnnotationCS__Group__0__Impl"
    // InternalOCLinEcore.g:7202:1: rule__AnnotationCS__Group__0__Impl : ( () ) ;
    public final void rule__AnnotationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7206:1: ( ( () ) )
            // InternalOCLinEcore.g:7207:1: ( () )
            {
            // InternalOCLinEcore.g:7207:1: ( () )
            // InternalOCLinEcore.g:7208:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAnnotationCSAction_0());
            }
            // InternalOCLinEcore.g:7209:1: ()
            // InternalOCLinEcore.g:7211:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getAnnotationCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__0__Impl"


    // $ANTLR start "rule__AnnotationCS__Group__1"
    // InternalOCLinEcore.g:7221:1: rule__AnnotationCS__Group__1 : rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 ;
    public final void rule__AnnotationCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7225:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
            // InternalOCLinEcore.g:7226:2: rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_17);
            rule__AnnotationCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__1"


    // $ANTLR start "rule__AnnotationCS__Group__1__Impl"
    // InternalOCLinEcore.g:7233:1: rule__AnnotationCS__Group__1__Impl : ( 'annotation' ) ;
    public final void rule__AnnotationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7237:1: ( ( 'annotation' ) )
            // InternalOCLinEcore.g:7238:1: ( 'annotation' )
            {
            // InternalOCLinEcore.g:7238:1: ( 'annotation' )
            // InternalOCLinEcore.g:7239:1: 'annotation'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAnnotationKeyword_1());
            }
            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getAnnotationKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__1__Impl"


    // $ANTLR start "rule__AnnotationCS__Group__2"
    // InternalOCLinEcore.g:7252:1: rule__AnnotationCS__Group__2 : rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 ;
    public final void rule__AnnotationCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7256:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
            // InternalOCLinEcore.g:7257:2: rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_17);
            rule__AnnotationCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__2"


    // $ANTLR start "rule__AnnotationCS__Group__2__Impl"
    // InternalOCLinEcore.g:7264:1: rule__AnnotationCS__Group__2__Impl : ( ( rule__AnnotationCS__NameAssignment_2 )? ) ;
    public final void rule__AnnotationCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7268:1: ( ( ( rule__AnnotationCS__NameAssignment_2 )? ) )
            // InternalOCLinEcore.g:7269:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
            {
            // InternalOCLinEcore.g:7269:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
            // InternalOCLinEcore.g:7270:1: ( rule__AnnotationCS__NameAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:7271:1: ( rule__AnnotationCS__NameAssignment_2 )?
            int alt90=2;
            int LA90_0 = input.LA(1);

            if ( (LA90_0==RULE_SINGLE_QUOTED_STRING||(LA90_0>=RULE_SIMPLE_ID && LA90_0<=RULE_ESCAPED_ID)||(LA90_0>=17 && LA90_0<=51)||(LA90_0>=54 && LA90_0<=60)) ) {
                alt90=1;
            }
            switch (alt90) {
                case 1 :
                    // InternalOCLinEcore.g:7271:2: rule__AnnotationCS__NameAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__NameAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__2__Impl"


    // $ANTLR start "rule__AnnotationCS__Group__3"
    // InternalOCLinEcore.g:7281:1: rule__AnnotationCS__Group__3 : rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 ;
    public final void rule__AnnotationCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7285:1: ( rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 )
            // InternalOCLinEcore.g:7286:2: rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_17);
            rule__AnnotationCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__3"


    // $ANTLR start "rule__AnnotationCS__Group__3__Impl"
    // InternalOCLinEcore.g:7293:1: rule__AnnotationCS__Group__3__Impl : ( ( rule__AnnotationCS__Group_3__0 )? ) ;
    public final void rule__AnnotationCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7297:1: ( ( ( rule__AnnotationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:7298:1: ( ( rule__AnnotationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:7298:1: ( ( rule__AnnotationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:7299:1: ( rule__AnnotationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:7300:1: ( rule__AnnotationCS__Group_3__0 )?
            int alt91=2;
            int LA91_0 = input.LA(1);

            if ( (LA91_0==102) ) {
                alt91=1;
            }
            switch (alt91) {
                case 1 :
                    // InternalOCLinEcore.g:7300:2: rule__AnnotationCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AnnotationCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__3__Impl"


    // $ANTLR start "rule__AnnotationCS__Group__4"
    // InternalOCLinEcore.g:7310:1: rule__AnnotationCS__Group__4 : rule__AnnotationCS__Group__4__Impl ;
    public final void rule__AnnotationCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7314:1: ( rule__AnnotationCS__Group__4__Impl )
            // InternalOCLinEcore.g:7315:2: rule__AnnotationCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__4"


    // $ANTLR start "rule__AnnotationCS__Group__4__Impl"
    // InternalOCLinEcore.g:7321:1: rule__AnnotationCS__Group__4__Impl : ( ( rule__AnnotationCS__Alternatives_4 ) ) ;
    public final void rule__AnnotationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7325:1: ( ( ( rule__AnnotationCS__Alternatives_4 ) ) )
            // InternalOCLinEcore.g:7326:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
            {
            // InternalOCLinEcore.g:7326:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
            // InternalOCLinEcore.g:7327:1: ( rule__AnnotationCS__Alternatives_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4());
            }
            // InternalOCLinEcore.g:7328:1: ( rule__AnnotationCS__Alternatives_4 )
            // InternalOCLinEcore.g:7328:2: rule__AnnotationCS__Alternatives_4
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Alternatives_4();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getAlternatives_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group__4__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3__0"
    // InternalOCLinEcore.g:7348:1: rule__AnnotationCS__Group_3__0 : rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 ;
    public final void rule__AnnotationCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7352:1: ( rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 )
            // InternalOCLinEcore.g:7353:2: rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__AnnotationCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__0"


    // $ANTLR start "rule__AnnotationCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:7360:1: rule__AnnotationCS__Group_3__0__Impl : ( '(' ) ;
    public final void rule__AnnotationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7364:1: ( ( '(' ) )
            // InternalOCLinEcore.g:7365:1: ( '(' )
            {
            // InternalOCLinEcore.g:7365:1: ( '(' )
            // InternalOCLinEcore.g:7366:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_3_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__0__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3__1"
    // InternalOCLinEcore.g:7379:1: rule__AnnotationCS__Group_3__1 : rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 ;
    public final void rule__AnnotationCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7383:1: ( rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 )
            // InternalOCLinEcore.g:7384:2: rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__AnnotationCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__1"


    // $ANTLR start "rule__AnnotationCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:7391:1: rule__AnnotationCS__Group_3__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) ;
    public final void rule__AnnotationCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7395:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:7396:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:7396:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
            // InternalOCLinEcore.g:7397:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_1());
            }
            // InternalOCLinEcore.g:7398:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
            // InternalOCLinEcore.g:7398:2: rule__AnnotationCS__OwnedDetailsAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__OwnedDetailsAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__1__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3__2"
    // InternalOCLinEcore.g:7408:1: rule__AnnotationCS__Group_3__2 : rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 ;
    public final void rule__AnnotationCS__Group_3__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7412:1: ( rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 )
            // InternalOCLinEcore.g:7413:2: rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__AnnotationCS__Group_3__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__2"


    // $ANTLR start "rule__AnnotationCS__Group_3__2__Impl"
    // InternalOCLinEcore.g:7420:1: rule__AnnotationCS__Group_3__2__Impl : ( ( rule__AnnotationCS__Group_3_2__0 )* ) ;
    public final void rule__AnnotationCS__Group_3__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7424:1: ( ( ( rule__AnnotationCS__Group_3_2__0 )* ) )
            // InternalOCLinEcore.g:7425:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
            {
            // InternalOCLinEcore.g:7425:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
            // InternalOCLinEcore.g:7426:1: ( rule__AnnotationCS__Group_3_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getGroup_3_2());
            }
            // InternalOCLinEcore.g:7427:1: ( rule__AnnotationCS__Group_3_2__0 )*
            loop92:
            do {
                int alt92=2;
                int LA92_0 = input.LA(1);

                if ( (LA92_0==105) ) {
                    alt92=1;
                }


                switch (alt92) {
            	case 1 :
            	    // InternalOCLinEcore.g:7427:2: rule__AnnotationCS__Group_3_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__AnnotationCS__Group_3_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getGroup_3_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__2__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3__3"
    // InternalOCLinEcore.g:7437:1: rule__AnnotationCS__Group_3__3 : rule__AnnotationCS__Group_3__3__Impl ;
    public final void rule__AnnotationCS__Group_3__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7441:1: ( rule__AnnotationCS__Group_3__3__Impl )
            // InternalOCLinEcore.g:7442:2: rule__AnnotationCS__Group_3__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__3"


    // $ANTLR start "rule__AnnotationCS__Group_3__3__Impl"
    // InternalOCLinEcore.g:7448:1: rule__AnnotationCS__Group_3__3__Impl : ( ')' ) ;
    public final void rule__AnnotationCS__Group_3__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7452:1: ( ( ')' ) )
            // InternalOCLinEcore.g:7453:1: ( ')' )
            {
            // InternalOCLinEcore.g:7453:1: ( ')' )
            // InternalOCLinEcore.g:7454:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_3_3());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_3_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3__3__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3_2__0"
    // InternalOCLinEcore.g:7475:1: rule__AnnotationCS__Group_3_2__0 : rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 ;
    public final void rule__AnnotationCS__Group_3_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7479:1: ( rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 )
            // InternalOCLinEcore.g:7480:2: rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__AnnotationCS__Group_3_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3_2__0"


    // $ANTLR start "rule__AnnotationCS__Group_3_2__0__Impl"
    // InternalOCLinEcore.g:7487:1: rule__AnnotationCS__Group_3_2__0__Impl : ( ',' ) ;
    public final void rule__AnnotationCS__Group_3_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7491:1: ( ( ',' ) )
            // InternalOCLinEcore.g:7492:1: ( ',' )
            {
            // InternalOCLinEcore.g:7492:1: ( ',' )
            // InternalOCLinEcore.g:7493:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getCommaKeyword_3_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getCommaKeyword_3_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3_2__0__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_3_2__1"
    // InternalOCLinEcore.g:7506:1: rule__AnnotationCS__Group_3_2__1 : rule__AnnotationCS__Group_3_2__1__Impl ;
    public final void rule__AnnotationCS__Group_3_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7510:1: ( rule__AnnotationCS__Group_3_2__1__Impl )
            // InternalOCLinEcore.g:7511:2: rule__AnnotationCS__Group_3_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_3_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3_2__1"


    // $ANTLR start "rule__AnnotationCS__Group_3_2__1__Impl"
    // InternalOCLinEcore.g:7517:1: rule__AnnotationCS__Group_3_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
    public final void rule__AnnotationCS__Group_3_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7521:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) )
            // InternalOCLinEcore.g:7522:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
            {
            // InternalOCLinEcore.g:7522:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
            // InternalOCLinEcore.g:7523:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }
            // InternalOCLinEcore.g:7524:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
            // InternalOCLinEcore.g:7524:2: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__OwnedDetailsAssignment_3_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_3_2__1__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__0"
    // InternalOCLinEcore.g:7538:1: rule__AnnotationCS__Group_4_0__0 : rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 ;
    public final void rule__AnnotationCS__Group_4_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7542:1: ( rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 )
            // InternalOCLinEcore.g:7543:2: rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1
            {
            pushFollow(FollowSets000.FOLLOW_21);
            rule__AnnotationCS__Group_4_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_4_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__0"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__0__Impl"
    // InternalOCLinEcore.g:7550:1: rule__AnnotationCS__Group_4_0__0__Impl : ( '{' ) ;
    public final void rule__AnnotationCS__Group_4_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7554:1: ( ( '{' ) )
            // InternalOCLinEcore.g:7555:1: ( '{' )
            {
            // InternalOCLinEcore.g:7555:1: ( '{' )
            // InternalOCLinEcore.g:7556:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__0__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__1"
    // InternalOCLinEcore.g:7569:1: rule__AnnotationCS__Group_4_0__1 : rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 ;
    public final void rule__AnnotationCS__Group_4_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7573:1: ( rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 )
            // InternalOCLinEcore.g:7574:2: rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__AnnotationCS__Group_4_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_4_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__1"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__1__Impl"
    // InternalOCLinEcore.g:7581:1: rule__AnnotationCS__Group_4_0__1__Impl : ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) ;
    public final void rule__AnnotationCS__Group_4_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7585:1: ( ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) )
            // InternalOCLinEcore.g:7586:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
            {
            // InternalOCLinEcore.g:7586:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
            // InternalOCLinEcore.g:7587:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
            {
            // InternalOCLinEcore.g:7587:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) )
            // InternalOCLinEcore.g:7588:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:7589:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
            // InternalOCLinEcore.g:7589:2: rule__AnnotationCS__Alternatives_4_0_1
            {
            pushFollow(FollowSets000.FOLLOW_23);
            rule__AnnotationCS__Alternatives_4_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }

            }

            // InternalOCLinEcore.g:7592:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
            // InternalOCLinEcore.g:7593:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:7594:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
            loop93:
            do {
                int alt93=2;
                int LA93_0 = input.LA(1);

                if ( ((LA93_0>=RULE_SIMPLE_ID && LA93_0<=RULE_ESCAPED_ID)||(LA93_0>=17 && LA93_0<=51)||(LA93_0>=54 && LA93_0<=55)||LA93_0==57||LA93_0==60) ) {
                    alt93=1;
                }


                switch (alt93) {
            	case 1 :
            	    // InternalOCLinEcore.g:7594:2: rule__AnnotationCS__Alternatives_4_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_23);
            	    rule__AnnotationCS__Alternatives_4_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__1__Impl"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__2"
    // InternalOCLinEcore.g:7605:1: rule__AnnotationCS__Group_4_0__2 : rule__AnnotationCS__Group_4_0__2__Impl ;
    public final void rule__AnnotationCS__Group_4_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7609:1: ( rule__AnnotationCS__Group_4_0__2__Impl )
            // InternalOCLinEcore.g:7610:2: rule__AnnotationCS__Group_4_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__Group_4_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__2"


    // $ANTLR start "rule__AnnotationCS__Group_4_0__2__Impl"
    // InternalOCLinEcore.g:7616:1: rule__AnnotationCS__Group_4_0__2__Impl : ( '}' ) ;
    public final void rule__AnnotationCS__Group_4_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7620:1: ( ( '}' ) )
            // InternalOCLinEcore.g:7621:1: ( '}' )
            {
            // InternalOCLinEcore.g:7621:1: ( '}' )
            // InternalOCLinEcore.g:7622:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__Group_4_0__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group__0"
    // InternalOCLinEcore.g:7641:1: rule__AttributeCS__Group__0 : rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 ;
    public final void rule__AttributeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7645:1: ( rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 )
            // InternalOCLinEcore.g:7646:2: rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_24);
            rule__AttributeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__0"


    // $ANTLR start "rule__AttributeCS__Group__0__Impl"
    // InternalOCLinEcore.g:7653:1: rule__AttributeCS__Group__0__Impl : ( ( rule__AttributeCS__Alternatives_0 )? ) ;
    public final void rule__AttributeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7657:1: ( ( ( rule__AttributeCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:7658:1: ( ( rule__AttributeCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:7658:1: ( ( rule__AttributeCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:7659:1: ( rule__AttributeCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:7660:1: ( rule__AttributeCS__Alternatives_0 )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==24||LA94_0==46) ) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // InternalOCLinEcore.g:7660:2: rule__AttributeCS__Alternatives_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Alternatives_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group__1"
    // InternalOCLinEcore.g:7670:1: rule__AttributeCS__Group__1 : rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 ;
    public final void rule__AttributeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7674:1: ( rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 )
            // InternalOCLinEcore.g:7675:2: rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__AttributeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__1"


    // $ANTLR start "rule__AttributeCS__Group__1__Impl"
    // InternalOCLinEcore.g:7682:1: rule__AttributeCS__Group__1__Impl : ( 'attribute' ) ;
    public final void rule__AttributeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7686:1: ( ( 'attribute' ) )
            // InternalOCLinEcore.g:7687:1: ( 'attribute' )
            {
            // InternalOCLinEcore.g:7687:1: ( 'attribute' )
            // InternalOCLinEcore.g:7688:1: 'attribute'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());
            }
            match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group__2"
    // InternalOCLinEcore.g:7701:1: rule__AttributeCS__Group__2 : rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 ;
    public final void rule__AttributeCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7705:1: ( rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 )
            // InternalOCLinEcore.g:7706:2: rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__AttributeCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__2"


    // $ANTLR start "rule__AttributeCS__Group__2__Impl"
    // InternalOCLinEcore.g:7713:1: rule__AttributeCS__Group__2__Impl : ( ( rule__AttributeCS__NameAssignment_2 ) ) ;
    public final void rule__AttributeCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7717:1: ( ( ( rule__AttributeCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:7718:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:7718:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:7719:1: ( rule__AttributeCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:7720:1: ( rule__AttributeCS__NameAssignment_2 )
            // InternalOCLinEcore.g:7720:2: rule__AttributeCS__NameAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__NameAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group__3"
    // InternalOCLinEcore.g:7730:1: rule__AttributeCS__Group__3 : rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 ;
    public final void rule__AttributeCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7734:1: ( rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 )
            // InternalOCLinEcore.g:7735:2: rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__AttributeCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__3"


    // $ANTLR start "rule__AttributeCS__Group__3__Impl"
    // InternalOCLinEcore.g:7742:1: rule__AttributeCS__Group__3__Impl : ( ( rule__AttributeCS__Group_3__0 )? ) ;
    public final void rule__AttributeCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7746:1: ( ( ( rule__AttributeCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:7747:1: ( ( rule__AttributeCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:7747:1: ( ( rule__AttributeCS__Group_3__0 )? )
            // InternalOCLinEcore.g:7748:1: ( rule__AttributeCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:7749:1: ( rule__AttributeCS__Group_3__0 )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==104) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalOCLinEcore.g:7749:2: rule__AttributeCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__3__Impl"


    // $ANTLR start "rule__AttributeCS__Group__4"
    // InternalOCLinEcore.g:7759:1: rule__AttributeCS__Group__4 : rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 ;
    public final void rule__AttributeCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7763:1: ( rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 )
            // InternalOCLinEcore.g:7764:2: rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__AttributeCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__4"


    // $ANTLR start "rule__AttributeCS__Group__4__Impl"
    // InternalOCLinEcore.g:7771:1: rule__AttributeCS__Group__4__Impl : ( ( rule__AttributeCS__Group_4__0 )? ) ;
    public final void rule__AttributeCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7775:1: ( ( ( rule__AttributeCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:7776:1: ( ( rule__AttributeCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:7776:1: ( ( rule__AttributeCS__Group_4__0 )? )
            // InternalOCLinEcore.g:7777:1: ( rule__AttributeCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:7778:1: ( rule__AttributeCS__Group_4__0 )?
            int alt96=2;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==71) ) {
                alt96=1;
            }
            switch (alt96) {
                case 1 :
                    // InternalOCLinEcore.g:7778:2: rule__AttributeCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__4__Impl"


    // $ANTLR start "rule__AttributeCS__Group__5"
    // InternalOCLinEcore.g:7788:1: rule__AttributeCS__Group__5 : rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 ;
    public final void rule__AttributeCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7792:1: ( rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 )
            // InternalOCLinEcore.g:7793:2: rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__AttributeCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__5"


    // $ANTLR start "rule__AttributeCS__Group__5__Impl"
    // InternalOCLinEcore.g:7800:1: rule__AttributeCS__Group__5__Impl : ( ( rule__AttributeCS__Group_5__0 )? ) ;
    public final void rule__AttributeCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7804:1: ( ( ( rule__AttributeCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:7805:1: ( ( rule__AttributeCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:7805:1: ( ( rule__AttributeCS__Group_5__0 )? )
            // InternalOCLinEcore.g:7806:1: ( rule__AttributeCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:7807:1: ( rule__AttributeCS__Group_5__0 )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==106) ) {
                int LA97_1 = input.LA(2);

                if ( (LA97_1==26||LA97_1==29||LA97_1==37||LA97_1==43||(LA97_1>=48 && LA97_1<=51)||(LA97_1>=128 && LA97_1<=135)) ) {
                    alt97=1;
                }
            }
            switch (alt97) {
                case 1 :
                    // InternalOCLinEcore.g:7807:2: rule__AttributeCS__Group_5__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__5__Impl"


    // $ANTLR start "rule__AttributeCS__Group__6"
    // InternalOCLinEcore.g:7817:1: rule__AttributeCS__Group__6 : rule__AttributeCS__Group__6__Impl ;
    public final void rule__AttributeCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7821:1: ( rule__AttributeCS__Group__6__Impl )
            // InternalOCLinEcore.g:7822:2: rule__AttributeCS__Group__6__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__6"


    // $ANTLR start "rule__AttributeCS__Group__6__Impl"
    // InternalOCLinEcore.g:7828:1: rule__AttributeCS__Group__6__Impl : ( ( rule__AttributeCS__Alternatives_6 ) ) ;
    public final void rule__AttributeCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7832:1: ( ( ( rule__AttributeCS__Alternatives_6 ) ) )
            // InternalOCLinEcore.g:7833:1: ( ( rule__AttributeCS__Alternatives_6 ) )
            {
            // InternalOCLinEcore.g:7833:1: ( ( rule__AttributeCS__Alternatives_6 ) )
            // InternalOCLinEcore.g:7834:1: ( rule__AttributeCS__Alternatives_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_6());
            }
            // InternalOCLinEcore.g:7835:1: ( rule__AttributeCS__Alternatives_6 )
            // InternalOCLinEcore.g:7835:2: rule__AttributeCS__Alternatives_6
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Alternatives_6();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getAlternatives_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group__6__Impl"


    // $ANTLR start "rule__AttributeCS__Group_0_0__0"
    // InternalOCLinEcore.g:7859:1: rule__AttributeCS__Group_0_0__0 : rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 ;
    public final void rule__AttributeCS__Group_0_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7863:1: ( rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 )
            // InternalOCLinEcore.g:7864:2: rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1
            {
            pushFollow(FollowSets000.FOLLOW_26);
            rule__AttributeCS__Group_0_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_0_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_0__0"


    // $ANTLR start "rule__AttributeCS__Group_0_0__0__Impl"
    // InternalOCLinEcore.g:7871:1: rule__AttributeCS__Group_0_0__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) ;
    public final void rule__AttributeCS__Group_0_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7875:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:7876:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:7876:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:7877:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:7878:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:7878:2: rule__AttributeCS__QualifiersAssignment_0_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__QualifiersAssignment_0_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_0__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_0_0__1"
    // InternalOCLinEcore.g:7888:1: rule__AttributeCS__Group_0_0__1 : rule__AttributeCS__Group_0_0__1__Impl ;
    public final void rule__AttributeCS__Group_0_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7892:1: ( rule__AttributeCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:7893:2: rule__AttributeCS__Group_0_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_0_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_0__1"


    // $ANTLR start "rule__AttributeCS__Group_0_0__1__Impl"
    // InternalOCLinEcore.g:7899:1: rule__AttributeCS__Group_0_0__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) ;
    public final void rule__AttributeCS__Group_0_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7903:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:7904:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:7904:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:7905:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:7906:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==24) ) {
                alt98=1;
            }
            switch (alt98) {
                case 1 :
                    // InternalOCLinEcore.g:7906:2: rule__AttributeCS__QualifiersAssignment_0_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_0_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_0__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_0_1__0"
    // InternalOCLinEcore.g:7920:1: rule__AttributeCS__Group_0_1__0 : rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 ;
    public final void rule__AttributeCS__Group_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7924:1: ( rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 )
            // InternalOCLinEcore.g:7925:2: rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_27);
            rule__AttributeCS__Group_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_0_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_1__0"


    // $ANTLR start "rule__AttributeCS__Group_0_1__0__Impl"
    // InternalOCLinEcore.g:7932:1: rule__AttributeCS__Group_0_1__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) ;
    public final void rule__AttributeCS__Group_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7936:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:7937:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:7937:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:7938:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:7939:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:7939:2: rule__AttributeCS__QualifiersAssignment_0_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__QualifiersAssignment_0_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_1__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_0_1__1"
    // InternalOCLinEcore.g:7949:1: rule__AttributeCS__Group_0_1__1 : rule__AttributeCS__Group_0_1__1__Impl ;
    public final void rule__AttributeCS__Group_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7953:1: ( rule__AttributeCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:7954:2: rule__AttributeCS__Group_0_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_0_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_1__1"


    // $ANTLR start "rule__AttributeCS__Group_0_1__1__Impl"
    // InternalOCLinEcore.g:7960:1: rule__AttributeCS__Group_0_1__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) ;
    public final void rule__AttributeCS__Group_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7964:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:7965:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:7965:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:7966:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:7967:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==46) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // InternalOCLinEcore.g:7967:2: rule__AttributeCS__QualifiersAssignment_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__QualifiersAssignment_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_0_1__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_3__0"
    // InternalOCLinEcore.g:7981:1: rule__AttributeCS__Group_3__0 : rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 ;
    public final void rule__AttributeCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7985:1: ( rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 )
            // InternalOCLinEcore.g:7986:2: rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__AttributeCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_3__0"


    // $ANTLR start "rule__AttributeCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:7993:1: rule__AttributeCS__Group_3__0__Impl : ( ':' ) ;
    public final void rule__AttributeCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7997:1: ( ( ':' ) )
            // InternalOCLinEcore.g:7998:1: ( ':' )
            {
            // InternalOCLinEcore.g:7998:1: ( ':' )
            // InternalOCLinEcore.g:7999:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_3__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_3__1"
    // InternalOCLinEcore.g:8012:1: rule__AttributeCS__Group_3__1 : rule__AttributeCS__Group_3__1__Impl ;
    public final void rule__AttributeCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8016:1: ( rule__AttributeCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:8017:2: rule__AttributeCS__Group_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_3__1"


    // $ANTLR start "rule__AttributeCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:8023:1: rule__AttributeCS__Group_3__1__Impl : ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) ;
    public final void rule__AttributeCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8027:1: ( ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:8028:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:8028:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
            // InternalOCLinEcore.g:8029:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedTypeAssignment_3_1());
            }
            // InternalOCLinEcore.g:8030:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
            // InternalOCLinEcore.g:8030:2: rule__AttributeCS__OwnedTypeAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__OwnedTypeAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedTypeAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_3__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_4__0"
    // InternalOCLinEcore.g:8044:1: rule__AttributeCS__Group_4__0 : rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 ;
    public final void rule__AttributeCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8048:1: ( rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 )
            // InternalOCLinEcore.g:8049:2: rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__AttributeCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_4__0"


    // $ANTLR start "rule__AttributeCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:8056:1: rule__AttributeCS__Group_4__0__Impl : ( '=' ) ;
    public final void rule__AttributeCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8060:1: ( ( '=' ) )
            // InternalOCLinEcore.g:8061:1: ( '=' )
            {
            // InternalOCLinEcore.g:8061:1: ( '=' )
            // InternalOCLinEcore.g:8062:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_4__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_4__1"
    // InternalOCLinEcore.g:8075:1: rule__AttributeCS__Group_4__1 : rule__AttributeCS__Group_4__1__Impl ;
    public final void rule__AttributeCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8079:1: ( rule__AttributeCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:8080:2: rule__AttributeCS__Group_4__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_4__1"


    // $ANTLR start "rule__AttributeCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:8086:1: rule__AttributeCS__Group_4__1__Impl : ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) ;
    public final void rule__AttributeCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8090:1: ( ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:8091:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:8091:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
            // InternalOCLinEcore.g:8092:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getDefaultAssignment_4_1());
            }
            // InternalOCLinEcore.g:8093:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
            // InternalOCLinEcore.g:8093:2: rule__AttributeCS__DefaultAssignment_4_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__DefaultAssignment_4_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getDefaultAssignment_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_4__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_5__0"
    // InternalOCLinEcore.g:8107:1: rule__AttributeCS__Group_5__0 : rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 ;
    public final void rule__AttributeCS__Group_5__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8111:1: ( rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 )
            // InternalOCLinEcore.g:8112:2: rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1
            {
            pushFollow(FollowSets000.FOLLOW_30);
            rule__AttributeCS__Group_5__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_5__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__0"


    // $ANTLR start "rule__AttributeCS__Group_5__0__Impl"
    // InternalOCLinEcore.g:8119:1: rule__AttributeCS__Group_5__0__Impl : ( '{' ) ;
    public final void rule__AttributeCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8123:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8124:1: ( '{' )
            {
            // InternalOCLinEcore.g:8124:1: ( '{' )
            // InternalOCLinEcore.g:8125:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_5__1"
    // InternalOCLinEcore.g:8138:1: rule__AttributeCS__Group_5__1 : rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 ;
    public final void rule__AttributeCS__Group_5__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8142:1: ( rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 )
            // InternalOCLinEcore.g:8143:2: rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__AttributeCS__Group_5__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_5__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__1"


    // $ANTLR start "rule__AttributeCS__Group_5__1__Impl"
    // InternalOCLinEcore.g:8150:1: rule__AttributeCS__Group_5__1__Impl : ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) ;
    public final void rule__AttributeCS__Group_5__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8154:1: ( ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) )
            // InternalOCLinEcore.g:8155:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
            {
            // InternalOCLinEcore.g:8155:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
            // InternalOCLinEcore.g:8156:1: ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* )
            {
            // InternalOCLinEcore.g:8156:1: ( ( rule__AttributeCS__Group_5_1__0 ) )
            // InternalOCLinEcore.g:8157:1: ( rule__AttributeCS__Group_5_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:8158:1: ( rule__AttributeCS__Group_5_1__0 )
            // InternalOCLinEcore.g:8158:2: rule__AttributeCS__Group_5_1__0
            {
            pushFollow(FollowSets000.FOLLOW_31);
            rule__AttributeCS__Group_5_1__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }

            }

            // InternalOCLinEcore.g:8161:1: ( ( rule__AttributeCS__Group_5_1__0 )* )
            // InternalOCLinEcore.g:8162:1: ( rule__AttributeCS__Group_5_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:8163:1: ( rule__AttributeCS__Group_5_1__0 )*
            loop100:
            do {
                int alt100=2;
                int LA100_0 = input.LA(1);

                if ( (LA100_0==26||LA100_0==29||LA100_0==37||LA100_0==43||(LA100_0>=48 && LA100_0<=51)||(LA100_0>=128 && LA100_0<=135)) ) {
                    alt100=1;
                }


                switch (alt100) {
            	case 1 :
            	    // InternalOCLinEcore.g:8163:2: rule__AttributeCS__Group_5_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_31);
            	    rule__AttributeCS__Group_5_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_5__2"
    // InternalOCLinEcore.g:8174:1: rule__AttributeCS__Group_5__2 : rule__AttributeCS__Group_5__2__Impl ;
    public final void rule__AttributeCS__Group_5__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8178:1: ( rule__AttributeCS__Group_5__2__Impl )
            // InternalOCLinEcore.g:8179:2: rule__AttributeCS__Group_5__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_5__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__2"


    // $ANTLR start "rule__AttributeCS__Group_5__2__Impl"
    // InternalOCLinEcore.g:8185:1: rule__AttributeCS__Group_5__2__Impl : ( '}' ) ;
    public final void rule__AttributeCS__Group_5__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8189:1: ( ( '}' ) )
            // InternalOCLinEcore.g:8190:1: ( '}' )
            {
            // InternalOCLinEcore.g:8190:1: ( '}' )
            // InternalOCLinEcore.g:8191:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group_5_1__0"
    // InternalOCLinEcore.g:8210:1: rule__AttributeCS__Group_5_1__0 : rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 ;
    public final void rule__AttributeCS__Group_5_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8214:1: ( rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 )
            // InternalOCLinEcore.g:8215:2: rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__AttributeCS__Group_5_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_5_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5_1__0"


    // $ANTLR start "rule__AttributeCS__Group_5_1__0__Impl"
    // InternalOCLinEcore.g:8222:1: rule__AttributeCS__Group_5_1__0__Impl : ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) ;
    public final void rule__AttributeCS__Group_5_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8226:1: ( ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) )
            // InternalOCLinEcore.g:8227:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
            {
            // InternalOCLinEcore.g:8227:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
            // InternalOCLinEcore.g:8228:1: ( rule__AttributeCS__Alternatives_5_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_5_1_0());
            }
            // InternalOCLinEcore.g:8229:1: ( rule__AttributeCS__Alternatives_5_1_0 )
            // InternalOCLinEcore.g:8229:2: rule__AttributeCS__Alternatives_5_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Alternatives_5_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getAlternatives_5_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5_1__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_5_1__1"
    // InternalOCLinEcore.g:8239:1: rule__AttributeCS__Group_5_1__1 : rule__AttributeCS__Group_5_1__1__Impl ;
    public final void rule__AttributeCS__Group_5_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8243:1: ( rule__AttributeCS__Group_5_1__1__Impl )
            // InternalOCLinEcore.g:8244:2: rule__AttributeCS__Group_5_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_5_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5_1__1"


    // $ANTLR start "rule__AttributeCS__Group_5_1__1__Impl"
    // InternalOCLinEcore.g:8250:1: rule__AttributeCS__Group_5_1__1__Impl : ( ( ',' )? ) ;
    public final void rule__AttributeCS__Group_5_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8254:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:8255:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:8255:1: ( ( ',' )? )
            // InternalOCLinEcore.g:8256:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());
            }
            // InternalOCLinEcore.g:8257:1: ( ',' )?
            int alt101=2;
            int LA101_0 = input.LA(1);

            if ( (LA101_0==105) ) {
                alt101=1;
            }
            switch (alt101) {
                case 1 :
                    // InternalOCLinEcore.g:8258:2: ','
                    {
                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_5_1__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0__0"
    // InternalOCLinEcore.g:8273:1: rule__AttributeCS__Group_6_0__0 : rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 ;
    public final void rule__AttributeCS__Group_6_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8277:1: ( rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 )
            // InternalOCLinEcore.g:8278:2: rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1
            {
            pushFollow(FollowSets000.FOLLOW_33);
            rule__AttributeCS__Group_6_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__0"


    // $ANTLR start "rule__AttributeCS__Group_6_0__0__Impl"
    // InternalOCLinEcore.g:8285:1: rule__AttributeCS__Group_6_0__0__Impl : ( '{' ) ;
    public final void rule__AttributeCS__Group_6_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8289:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8290:1: ( '{' )
            {
            // InternalOCLinEcore.g:8290:1: ( '{' )
            // InternalOCLinEcore.g:8291:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0__1"
    // InternalOCLinEcore.g:8304:1: rule__AttributeCS__Group_6_0__1 : rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 ;
    public final void rule__AttributeCS__Group_6_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8308:1: ( rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 )
            // InternalOCLinEcore.g:8309:2: rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2
            {
            pushFollow(FollowSets000.FOLLOW_33);
            rule__AttributeCS__Group_6_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__1"


    // $ANTLR start "rule__AttributeCS__Group_6_0__1__Impl"
    // InternalOCLinEcore.g:8316:1: rule__AttributeCS__Group_6_0__1__Impl : ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) ;
    public final void rule__AttributeCS__Group_6_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8320:1: ( ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) )
            // InternalOCLinEcore.g:8321:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
            {
            // InternalOCLinEcore.g:8321:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
            // InternalOCLinEcore.g:8322:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_6_0_1());
            }
            // InternalOCLinEcore.g:8323:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
            loop102:
            do {
                int alt102=2;
                int LA102_0 = input.LA(1);

                if ( (LA102_0==25||LA102_0==31||(LA102_0>=54 && LA102_0<=55)||LA102_0==60) ) {
                    alt102=1;
                }


                switch (alt102) {
            	case 1 :
            	    // InternalOCLinEcore.g:8323:2: rule__AttributeCS__Alternatives_6_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_34);
            	    rule__AttributeCS__Alternatives_6_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getAlternatives_6_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0__2"
    // InternalOCLinEcore.g:8333:1: rule__AttributeCS__Group_6_0__2 : rule__AttributeCS__Group_6_0__2__Impl ;
    public final void rule__AttributeCS__Group_6_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8337:1: ( rule__AttributeCS__Group_6_0__2__Impl )
            // InternalOCLinEcore.g:8338:2: rule__AttributeCS__Group_6_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__2"


    // $ANTLR start "rule__AttributeCS__Group_6_0__2__Impl"
    // InternalOCLinEcore.g:8344:1: rule__AttributeCS__Group_6_0__2__Impl : ( '}' ) ;
    public final void rule__AttributeCS__Group_6_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8348:1: ( ( '}' ) )
            // InternalOCLinEcore.g:8349:1: ( '}' )
            {
            // InternalOCLinEcore.g:8349:1: ( '}' )
            // InternalOCLinEcore.g:8350:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__0"
    // InternalOCLinEcore.g:8369:1: rule__AttributeCS__Group_6_0_1_1__0 : rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 ;
    public final void rule__AttributeCS__Group_6_0_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8373:1: ( rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 )
            // InternalOCLinEcore.g:8374:2: rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__AttributeCS__Group_6_0_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__0"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__0__Impl"
    // InternalOCLinEcore.g:8381:1: rule__AttributeCS__Group_6_0_1_1__0__Impl : ( 'initial' ) ;
    public final void rule__AttributeCS__Group_6_0_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8385:1: ( ( 'initial' ) )
            // InternalOCLinEcore.g:8386:1: ( 'initial' )
            {
            // InternalOCLinEcore.g:8386:1: ( 'initial' )
            // InternalOCLinEcore.g:8387:1: 'initial'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_1_0());
            }
            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__1"
    // InternalOCLinEcore.g:8400:1: rule__AttributeCS__Group_6_0_1_1__1 : rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 ;
    public final void rule__AttributeCS__Group_6_0_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8404:1: ( rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 )
            // InternalOCLinEcore.g:8405:2: rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__AttributeCS__Group_6_0_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__1"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__1__Impl"
    // InternalOCLinEcore.g:8412:1: rule__AttributeCS__Group_6_0_1_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
    public final void rule__AttributeCS__Group_6_0_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8416:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:8417:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:8417:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:8418:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());
            }
            // InternalOCLinEcore.g:8419:1: ( ruleUnrestrictedName )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( ((LA103_0>=RULE_SIMPLE_ID && LA103_0<=RULE_ESCAPED_ID)||(LA103_0>=17 && LA103_0<=51)||(LA103_0>=54 && LA103_0<=60)) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // InternalOCLinEcore.g:8419:3: ruleUnrestrictedName
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__2"
    // InternalOCLinEcore.g:8429:1: rule__AttributeCS__Group_6_0_1_1__2 : rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 ;
    public final void rule__AttributeCS__Group_6_0_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8433:1: ( rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 )
            // InternalOCLinEcore.g:8434:2: rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__AttributeCS__Group_6_0_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__2"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__2__Impl"
    // InternalOCLinEcore.g:8441:1: rule__AttributeCS__Group_6_0_1_1__2__Impl : ( ':' ) ;
    public final void rule__AttributeCS__Group_6_0_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8445:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8446:1: ( ':' )
            {
            // InternalOCLinEcore.g:8446:1: ( ':' )
            // InternalOCLinEcore.g:8447:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__3"
    // InternalOCLinEcore.g:8460:1: rule__AttributeCS__Group_6_0_1_1__3 : rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 ;
    public final void rule__AttributeCS__Group_6_0_1_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8464:1: ( rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 )
            // InternalOCLinEcore.g:8465:2: rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__AttributeCS__Group_6_0_1_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_1__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__3"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__3__Impl"
    // InternalOCLinEcore.g:8472:1: rule__AttributeCS__Group_6_0_1_1__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) ;
    public final void rule__AttributeCS__Group_6_0_1_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8476:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) )
            // InternalOCLinEcore.g:8477:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
            {
            // InternalOCLinEcore.g:8477:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
            // InternalOCLinEcore.g:8478:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_1_3());
            }
            // InternalOCLinEcore.g:8479:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( ((LA104_0>=RULE_INT && LA104_0<=RULE_SINGLE_QUOTED_STRING)||(LA104_0>=RULE_SIMPLE_ID && LA104_0<=RULE_UNQUOTED_STRING)||(LA104_0>=17 && LA104_0<=51)||(LA104_0>=54 && LA104_0<=64)||(LA104_0>=85 && LA104_0<=99)||LA104_0==102||LA104_0==112||(LA104_0>=114 && LA104_0<=115)||LA104_0==120||(LA104_0>=125 && LA104_0<=126)||(LA104_0>=139 && LA104_0<=140)) ) {
                alt104=1;
            }
            switch (alt104) {
                case 1 :
                    // InternalOCLinEcore.g:8479:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__3__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__4"
    // InternalOCLinEcore.g:8489:1: rule__AttributeCS__Group_6_0_1_1__4 : rule__AttributeCS__Group_6_0_1_1__4__Impl ;
    public final void rule__AttributeCS__Group_6_0_1_1__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8493:1: ( rule__AttributeCS__Group_6_0_1_1__4__Impl )
            // InternalOCLinEcore.g:8494:2: rule__AttributeCS__Group_6_0_1_1__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_1__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__4"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__4__Impl"
    // InternalOCLinEcore.g:8500:1: rule__AttributeCS__Group_6_0_1_1__4__Impl : ( ';' ) ;
    public final void rule__AttributeCS__Group_6_0_1_1__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8504:1: ( ( ';' ) )
            // InternalOCLinEcore.g:8505:1: ( ';' )
            {
            // InternalOCLinEcore.g:8505:1: ( ';' )
            // InternalOCLinEcore.g:8506:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_1__4__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__0"
    // InternalOCLinEcore.g:8529:1: rule__AttributeCS__Group_6_0_1_2__0 : rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 ;
    public final void rule__AttributeCS__Group_6_0_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8533:1: ( rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 )
            // InternalOCLinEcore.g:8534:2: rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__AttributeCS__Group_6_0_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__0"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__0__Impl"
    // InternalOCLinEcore.g:8541:1: rule__AttributeCS__Group_6_0_1_2__0__Impl : ( 'derivation' ) ;
    public final void rule__AttributeCS__Group_6_0_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8545:1: ( ( 'derivation' ) )
            // InternalOCLinEcore.g:8546:1: ( 'derivation' )
            {
            // InternalOCLinEcore.g:8546:1: ( 'derivation' )
            // InternalOCLinEcore.g:8547:1: 'derivation'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_2_0());
            }
            match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__0__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__1"
    // InternalOCLinEcore.g:8560:1: rule__AttributeCS__Group_6_0_1_2__1 : rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 ;
    public final void rule__AttributeCS__Group_6_0_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8564:1: ( rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 )
            // InternalOCLinEcore.g:8565:2: rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__AttributeCS__Group_6_0_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__1"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__1__Impl"
    // InternalOCLinEcore.g:8572:1: rule__AttributeCS__Group_6_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
    public final void rule__AttributeCS__Group_6_0_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8576:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:8577:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:8577:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:8578:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_2_1());
            }
            // InternalOCLinEcore.g:8579:1: ( ruleUnrestrictedName )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( ((LA105_0>=RULE_SIMPLE_ID && LA105_0<=RULE_ESCAPED_ID)||(LA105_0>=17 && LA105_0<=51)||(LA105_0>=54 && LA105_0<=60)) ) {
                alt105=1;
            }
            switch (alt105) {
                case 1 :
                    // InternalOCLinEcore.g:8579:3: ruleUnrestrictedName
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__1__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__2"
    // InternalOCLinEcore.g:8589:1: rule__AttributeCS__Group_6_0_1_2__2 : rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 ;
    public final void rule__AttributeCS__Group_6_0_1_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8593:1: ( rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 )
            // InternalOCLinEcore.g:8594:2: rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__AttributeCS__Group_6_0_1_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_2__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__2"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__2__Impl"
    // InternalOCLinEcore.g:8601:1: rule__AttributeCS__Group_6_0_1_2__2__Impl : ( ':' ) ;
    public final void rule__AttributeCS__Group_6_0_1_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8605:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8606:1: ( ':' )
            {
            // InternalOCLinEcore.g:8606:1: ( ':' )
            // InternalOCLinEcore.g:8607:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_2_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__2__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__3"
    // InternalOCLinEcore.g:8620:1: rule__AttributeCS__Group_6_0_1_2__3 : rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 ;
    public final void rule__AttributeCS__Group_6_0_1_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8624:1: ( rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 )
            // InternalOCLinEcore.g:8625:2: rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__AttributeCS__Group_6_0_1_2__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_2__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__3"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__3__Impl"
    // InternalOCLinEcore.g:8632:1: rule__AttributeCS__Group_6_0_1_2__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) ;
    public final void rule__AttributeCS__Group_6_0_1_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8636:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:8637:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:8637:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
            // InternalOCLinEcore.g:8638:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_2_3());
            }
            // InternalOCLinEcore.g:8639:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( ((LA106_0>=RULE_INT && LA106_0<=RULE_SINGLE_QUOTED_STRING)||(LA106_0>=RULE_SIMPLE_ID && LA106_0<=RULE_UNQUOTED_STRING)||(LA106_0>=17 && LA106_0<=51)||(LA106_0>=54 && LA106_0<=64)||(LA106_0>=85 && LA106_0<=99)||LA106_0==102||LA106_0==112||(LA106_0>=114 && LA106_0<=115)||LA106_0==120||(LA106_0>=125 && LA106_0<=126)||(LA106_0>=139 && LA106_0<=140)) ) {
                alt106=1;
            }
            switch (alt106) {
                case 1 :
                    // InternalOCLinEcore.g:8639:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_2_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__3__Impl"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__4"
    // InternalOCLinEcore.g:8649:1: rule__AttributeCS__Group_6_0_1_2__4 : rule__AttributeCS__Group_6_0_1_2__4__Impl ;
    public final void rule__AttributeCS__Group_6_0_1_2__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8653:1: ( rule__AttributeCS__Group_6_0_1_2__4__Impl )
            // InternalOCLinEcore.g:8654:2: rule__AttributeCS__Group_6_0_1_2__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AttributeCS__Group_6_0_1_2__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__4"


    // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__4__Impl"
    // InternalOCLinEcore.g:8660:1: rule__AttributeCS__Group_6_0_1_2__4__Impl : ( ';' ) ;
    public final void rule__AttributeCS__Group_6_0_1_2__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8664:1: ( ( ';' ) )
            // InternalOCLinEcore.g:8665:1: ( ';' )
            {
            // InternalOCLinEcore.g:8665:1: ( ';' )
            // InternalOCLinEcore.g:8666:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_2_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_2_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__Group_6_0_1_2__4__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__0"
    // InternalOCLinEcore.g:8689:1: rule__DataTypeCS__Group__0 : rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 ;
    public final void rule__DataTypeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8693:1: ( rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 )
            // InternalOCLinEcore.g:8694:2: rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_35);
            rule__DataTypeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__0"


    // $ANTLR start "rule__DataTypeCS__Group__0__Impl"
    // InternalOCLinEcore.g:8701:1: rule__DataTypeCS__Group__0__Impl : ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) ;
    public final void rule__DataTypeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8705:1: ( ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) )
            // InternalOCLinEcore.g:8706:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
            {
            // InternalOCLinEcore.g:8706:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
            // InternalOCLinEcore.g:8707:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsPrimitiveAssignment_0());
            }
            // InternalOCLinEcore.g:8708:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==41) ) {
                alt107=1;
            }
            switch (alt107) {
                case 1 :
                    // InternalOCLinEcore.g:8708:2: rule__DataTypeCS__IsPrimitiveAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__IsPrimitiveAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getIsPrimitiveAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__0__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__1"
    // InternalOCLinEcore.g:8718:1: rule__DataTypeCS__Group__1 : rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 ;
    public final void rule__DataTypeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8722:1: ( rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 )
            // InternalOCLinEcore.g:8723:2: rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__DataTypeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__1"


    // $ANTLR start "rule__DataTypeCS__Group__1__Impl"
    // InternalOCLinEcore.g:8730:1: rule__DataTypeCS__Group__1__Impl : ( 'datatype' ) ;
    public final void rule__DataTypeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8734:1: ( ( 'datatype' ) )
            // InternalOCLinEcore.g:8735:1: ( 'datatype' )
            {
            // InternalOCLinEcore.g:8735:1: ( 'datatype' )
            // InternalOCLinEcore.g:8736:1: 'datatype'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());
            }
            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__1__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__2"
    // InternalOCLinEcore.g:8749:1: rule__DataTypeCS__Group__2 : rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 ;
    public final void rule__DataTypeCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8753:1: ( rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 )
            // InternalOCLinEcore.g:8754:2: rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__DataTypeCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__2"


    // $ANTLR start "rule__DataTypeCS__Group__2__Impl"
    // InternalOCLinEcore.g:8761:1: rule__DataTypeCS__Group__2__Impl : ( ( rule__DataTypeCS__NameAssignment_2 ) ) ;
    public final void rule__DataTypeCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8765:1: ( ( ( rule__DataTypeCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:8766:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:8766:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:8767:1: ( rule__DataTypeCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:8768:1: ( rule__DataTypeCS__NameAssignment_2 )
            // InternalOCLinEcore.g:8768:2: rule__DataTypeCS__NameAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__NameAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__2__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__3"
    // InternalOCLinEcore.g:8778:1: rule__DataTypeCS__Group__3 : rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 ;
    public final void rule__DataTypeCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8782:1: ( rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 )
            // InternalOCLinEcore.g:8783:2: rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__DataTypeCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__3"


    // $ANTLR start "rule__DataTypeCS__Group__3__Impl"
    // InternalOCLinEcore.g:8790:1: rule__DataTypeCS__Group__3__Impl : ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) ;
    public final void rule__DataTypeCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8794:1: ( ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) )
            // InternalOCLinEcore.g:8795:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
            {
            // InternalOCLinEcore.g:8795:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
            // InternalOCLinEcore.g:8796:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getOwnedSignatureAssignment_3());
            }
            // InternalOCLinEcore.g:8797:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==68||LA108_0==102) ) {
                alt108=1;
            }
            switch (alt108) {
                case 1 :
                    // InternalOCLinEcore.g:8797:2: rule__DataTypeCS__OwnedSignatureAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__OwnedSignatureAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getOwnedSignatureAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__3__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__4"
    // InternalOCLinEcore.g:8807:1: rule__DataTypeCS__Group__4 : rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 ;
    public final void rule__DataTypeCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8811:1: ( rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 )
            // InternalOCLinEcore.g:8812:2: rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__DataTypeCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__4"


    // $ANTLR start "rule__DataTypeCS__Group__4__Impl"
    // InternalOCLinEcore.g:8819:1: rule__DataTypeCS__Group__4__Impl : ( ( rule__DataTypeCS__Group_4__0 )? ) ;
    public final void rule__DataTypeCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8823:1: ( ( ( rule__DataTypeCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:8824:1: ( ( rule__DataTypeCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:8824:1: ( ( rule__DataTypeCS__Group_4__0 )? )
            // InternalOCLinEcore.g:8825:1: ( rule__DataTypeCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:8826:1: ( rule__DataTypeCS__Group_4__0 )?
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==104) ) {
                alt109=1;
            }
            switch (alt109) {
                case 1 :
                    // InternalOCLinEcore.g:8826:2: rule__DataTypeCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__4__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__5"
    // InternalOCLinEcore.g:8836:1: rule__DataTypeCS__Group__5 : rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 ;
    public final void rule__DataTypeCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8840:1: ( rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 )
            // InternalOCLinEcore.g:8841:2: rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__DataTypeCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__5"


    // $ANTLR start "rule__DataTypeCS__Group__5__Impl"
    // InternalOCLinEcore.g:8848:1: rule__DataTypeCS__Group__5__Impl : ( ( rule__DataTypeCS__Group_5__0 )? ) ;
    public final void rule__DataTypeCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8852:1: ( ( ( rule__DataTypeCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:8853:1: ( ( rule__DataTypeCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:8853:1: ( ( rule__DataTypeCS__Group_5__0 )? )
            // InternalOCLinEcore.g:8854:1: ( rule__DataTypeCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:8855:1: ( rule__DataTypeCS__Group_5__0 )?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==106) ) {
                int LA110_1 = input.LA(2);

                if ( (LA110_1==53||LA110_1==59) ) {
                    alt110=1;
                }
                else if ( (LA110_1==107) ) {
                    int LA110_4 = input.LA(3);

                    if ( (LA110_4==52||LA110_4==106) ) {
                        alt110=1;
                    }
                }
            }
            switch (alt110) {
                case 1 :
                    // InternalOCLinEcore.g:8855:2: rule__DataTypeCS__Group_5__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getGroup_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__5__Impl"


    // $ANTLR start "rule__DataTypeCS__Group__6"
    // InternalOCLinEcore.g:8865:1: rule__DataTypeCS__Group__6 : rule__DataTypeCS__Group__6__Impl ;
    public final void rule__DataTypeCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8869:1: ( rule__DataTypeCS__Group__6__Impl )
            // InternalOCLinEcore.g:8870:2: rule__DataTypeCS__Group__6__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__6"


    // $ANTLR start "rule__DataTypeCS__Group__6__Impl"
    // InternalOCLinEcore.g:8876:1: rule__DataTypeCS__Group__6__Impl : ( ( rule__DataTypeCS__Alternatives_6 ) ) ;
    public final void rule__DataTypeCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8880:1: ( ( ( rule__DataTypeCS__Alternatives_6 ) ) )
            // InternalOCLinEcore.g:8881:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
            {
            // InternalOCLinEcore.g:8881:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
            // InternalOCLinEcore.g:8882:1: ( rule__DataTypeCS__Alternatives_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_6());
            }
            // InternalOCLinEcore.g:8883:1: ( rule__DataTypeCS__Alternatives_6 )
            // InternalOCLinEcore.g:8883:2: rule__DataTypeCS__Alternatives_6
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Alternatives_6();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getAlternatives_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group__6__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_4__0"
    // InternalOCLinEcore.g:8907:1: rule__DataTypeCS__Group_4__0 : rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 ;
    public final void rule__DataTypeCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8911:1: ( rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 )
            // InternalOCLinEcore.g:8912:2: rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__DataTypeCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_4__0"


    // $ANTLR start "rule__DataTypeCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:8919:1: rule__DataTypeCS__Group_4__0__Impl : ( ':' ) ;
    public final void rule__DataTypeCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8923:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8924:1: ( ':' )
            {
            // InternalOCLinEcore.g:8924:1: ( ':' )
            // InternalOCLinEcore.g:8925:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_4__0__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_4__1"
    // InternalOCLinEcore.g:8938:1: rule__DataTypeCS__Group_4__1 : rule__DataTypeCS__Group_4__1__Impl ;
    public final void rule__DataTypeCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8942:1: ( rule__DataTypeCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:8943:2: rule__DataTypeCS__Group_4__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_4__1"


    // $ANTLR start "rule__DataTypeCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:8949:1: rule__DataTypeCS__Group_4__1__Impl : ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) ;
    public final void rule__DataTypeCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8953:1: ( ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:8954:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:8954:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
            // InternalOCLinEcore.g:8955:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getInstanceClassNameAssignment_4_1());
            }
            // InternalOCLinEcore.g:8956:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
            // InternalOCLinEcore.g:8956:2: rule__DataTypeCS__InstanceClassNameAssignment_4_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__InstanceClassNameAssignment_4_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getInstanceClassNameAssignment_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_4__1__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_5__0"
    // InternalOCLinEcore.g:8970:1: rule__DataTypeCS__Group_5__0 : rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 ;
    public final void rule__DataTypeCS__Group_5__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8974:1: ( rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 )
            // InternalOCLinEcore.g:8975:2: rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1
            {
            pushFollow(FollowSets000.FOLLOW_37);
            rule__DataTypeCS__Group_5__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_5__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__0"


    // $ANTLR start "rule__DataTypeCS__Group_5__0__Impl"
    // InternalOCLinEcore.g:8982:1: rule__DataTypeCS__Group_5__0__Impl : ( '{' ) ;
    public final void rule__DataTypeCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8986:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8987:1: ( '{' )
            {
            // InternalOCLinEcore.g:8987:1: ( '{' )
            // InternalOCLinEcore.g:8988:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__0__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_5__1"
    // InternalOCLinEcore.g:9001:1: rule__DataTypeCS__Group_5__1 : rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 ;
    public final void rule__DataTypeCS__Group_5__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9005:1: ( rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 )
            // InternalOCLinEcore.g:9006:2: rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2
            {
            pushFollow(FollowSets000.FOLLOW_37);
            rule__DataTypeCS__Group_5__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_5__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__1"


    // $ANTLR start "rule__DataTypeCS__Group_5__1__Impl"
    // InternalOCLinEcore.g:9013:1: rule__DataTypeCS__Group_5__1__Impl : ( ( rule__DataTypeCS__Alternatives_5_1 )? ) ;
    public final void rule__DataTypeCS__Group_5__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9017:1: ( ( ( rule__DataTypeCS__Alternatives_5_1 )? ) )
            // InternalOCLinEcore.g:9018:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
            {
            // InternalOCLinEcore.g:9018:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
            // InternalOCLinEcore.g:9019:1: ( rule__DataTypeCS__Alternatives_5_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_5_1());
            }
            // InternalOCLinEcore.g:9020:1: ( rule__DataTypeCS__Alternatives_5_1 )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==53||LA111_0==59) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // InternalOCLinEcore.g:9020:2: rule__DataTypeCS__Alternatives_5_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DataTypeCS__Alternatives_5_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getAlternatives_5_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__1__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_5__2"
    // InternalOCLinEcore.g:9030:1: rule__DataTypeCS__Group_5__2 : rule__DataTypeCS__Group_5__2__Impl ;
    public final void rule__DataTypeCS__Group_5__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9034:1: ( rule__DataTypeCS__Group_5__2__Impl )
            // InternalOCLinEcore.g:9035:2: rule__DataTypeCS__Group_5__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_5__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__2"


    // $ANTLR start "rule__DataTypeCS__Group_5__2__Impl"
    // InternalOCLinEcore.g:9041:1: rule__DataTypeCS__Group_5__2__Impl : ( '}' ) ;
    public final void rule__DataTypeCS__Group_5__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9045:1: ( ( '}' ) )
            // InternalOCLinEcore.g:9046:1: ( '}' )
            {
            // InternalOCLinEcore.g:9046:1: ( '}' )
            // InternalOCLinEcore.g:9047:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_5__2__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__0"
    // InternalOCLinEcore.g:9066:1: rule__DataTypeCS__Group_6_0__0 : rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 ;
    public final void rule__DataTypeCS__Group_6_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9070:1: ( rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 )
            // InternalOCLinEcore.g:9071:2: rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1
            {
            pushFollow(FollowSets000.FOLLOW_38);
            rule__DataTypeCS__Group_6_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_6_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__0"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__0__Impl"
    // InternalOCLinEcore.g:9078:1: rule__DataTypeCS__Group_6_0__0__Impl : ( '{' ) ;
    public final void rule__DataTypeCS__Group_6_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9082:1: ( ( '{' ) )
            // InternalOCLinEcore.g:9083:1: ( '{' )
            {
            // InternalOCLinEcore.g:9083:1: ( '{' )
            // InternalOCLinEcore.g:9084:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__0__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__1"
    // InternalOCLinEcore.g:9097:1: rule__DataTypeCS__Group_6_0__1 : rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 ;
    public final void rule__DataTypeCS__Group_6_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9101:1: ( rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 )
            // InternalOCLinEcore.g:9102:2: rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2
            {
            pushFollow(FollowSets000.FOLLOW_38);
            rule__DataTypeCS__Group_6_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_6_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__1"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__1__Impl"
    // InternalOCLinEcore.g:9109:1: rule__DataTypeCS__Group_6_0__1__Impl : ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) ;
    public final void rule__DataTypeCS__Group_6_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9113:1: ( ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) )
            // InternalOCLinEcore.g:9114:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
            {
            // InternalOCLinEcore.g:9114:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
            // InternalOCLinEcore.g:9115:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_6_0_1());
            }
            // InternalOCLinEcore.g:9116:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
            loop112:
            do {
                int alt112=2;
                int LA112_0 = input.LA(1);

                if ( (LA112_0==20||(LA112_0>=54 && LA112_0<=56)||LA112_0==60) ) {
                    alt112=1;
                }


                switch (alt112) {
            	case 1 :
            	    // InternalOCLinEcore.g:9116:2: rule__DataTypeCS__Alternatives_6_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_39);
            	    rule__DataTypeCS__Alternatives_6_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getAlternatives_6_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__1__Impl"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__2"
    // InternalOCLinEcore.g:9126:1: rule__DataTypeCS__Group_6_0__2 : rule__DataTypeCS__Group_6_0__2__Impl ;
    public final void rule__DataTypeCS__Group_6_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9130:1: ( rule__DataTypeCS__Group_6_0__2__Impl )
            // InternalOCLinEcore.g:9131:2: rule__DataTypeCS__Group_6_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DataTypeCS__Group_6_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__2"


    // $ANTLR start "rule__DataTypeCS__Group_6_0__2__Impl"
    // InternalOCLinEcore.g:9137:1: rule__DataTypeCS__Group_6_0__2__Impl : ( '}' ) ;
    public final void rule__DataTypeCS__Group_6_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9141:1: ( ( '}' ) )
            // InternalOCLinEcore.g:9142:1: ( '}' )
            {
            // InternalOCLinEcore.g:9142:1: ( '}' )
            // InternalOCLinEcore.g:9143:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__Group_6_0__2__Impl"


    // $ANTLR start "rule__DetailCS__Group__0"
    // InternalOCLinEcore.g:9162:1: rule__DetailCS__Group__0 : rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 ;
    public final void rule__DetailCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9166:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
            // InternalOCLinEcore.g:9167:2: rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__DetailCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__0"


    // $ANTLR start "rule__DetailCS__Group__0__Impl"
    // InternalOCLinEcore.g:9174:1: rule__DetailCS__Group__0__Impl : ( ( rule__DetailCS__NameAssignment_0 ) ) ;
    public final void rule__DetailCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9178:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:9179:1: ( ( rule__DetailCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:9179:1: ( ( rule__DetailCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:9180:1: ( rule__DetailCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:9181:1: ( rule__DetailCS__NameAssignment_0 )
            // InternalOCLinEcore.g:9181:2: rule__DetailCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__0__Impl"


    // $ANTLR start "rule__DetailCS__Group__1"
    // InternalOCLinEcore.g:9191:1: rule__DetailCS__Group__1 : rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 ;
    public final void rule__DetailCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9195:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
            // InternalOCLinEcore.g:9196:2: rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_41);
            rule__DetailCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__1"


    // $ANTLR start "rule__DetailCS__Group__1__Impl"
    // InternalOCLinEcore.g:9203:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
    public final void rule__DetailCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9207:1: ( ( '=' ) )
            // InternalOCLinEcore.g:9208:1: ( '=' )
            {
            // InternalOCLinEcore.g:9208:1: ( '=' )
            // InternalOCLinEcore.g:9209:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__1__Impl"


    // $ANTLR start "rule__DetailCS__Group__2"
    // InternalOCLinEcore.g:9222:1: rule__DetailCS__Group__2 : rule__DetailCS__Group__2__Impl ;
    public final void rule__DetailCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9226:1: ( rule__DetailCS__Group__2__Impl )
            // InternalOCLinEcore.g:9227:2: rule__DetailCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__2"


    // $ANTLR start "rule__DetailCS__Group__2__Impl"
    // InternalOCLinEcore.g:9233:1: rule__DetailCS__Group__2__Impl : ( ( rule__DetailCS__ValuesAssignment_2 )* ) ;
    public final void rule__DetailCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9237:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
            // InternalOCLinEcore.g:9238:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
            {
            // InternalOCLinEcore.g:9238:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
            // InternalOCLinEcore.g:9239:1: ( rule__DetailCS__ValuesAssignment_2 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getValuesAssignment_2());
            }
            // InternalOCLinEcore.g:9240:1: ( rule__DetailCS__ValuesAssignment_2 )*
            loop113:
            do {
                int alt113=2;
                int LA113_0 = input.LA(1);

                if ( ((LA113_0>=RULE_SINGLE_QUOTED_STRING && LA113_0<=RULE_ML_SINGLE_QUOTED_STRING)) ) {
                    alt113=1;
                }


                switch (alt113) {
            	case 1 :
            	    // InternalOCLinEcore.g:9240:2: rule__DetailCS__ValuesAssignment_2
            	    {
            	    pushFollow(FollowSets000.FOLLOW_42);
            	    rule__DetailCS__ValuesAssignment_2();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getValuesAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__Group__2__Impl"


    // $ANTLR start "rule__DocumentationCS__Group__0"
    // InternalOCLinEcore.g:9256:1: rule__DocumentationCS__Group__0 : rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 ;
    public final void rule__DocumentationCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9260:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
            // InternalOCLinEcore.g:9261:2: rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_43);
            rule__DocumentationCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__0"


    // $ANTLR start "rule__DocumentationCS__Group__0__Impl"
    // InternalOCLinEcore.g:9268:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
    public final void rule__DocumentationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9272:1: ( ( () ) )
            // InternalOCLinEcore.g:9273:1: ( () )
            {
            // InternalOCLinEcore.g:9273:1: ( () )
            // InternalOCLinEcore.g:9274:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0());
            }
            // InternalOCLinEcore.g:9275:1: ()
            // InternalOCLinEcore.g:9277:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__0__Impl"


    // $ANTLR start "rule__DocumentationCS__Group__1"
    // InternalOCLinEcore.g:9287:1: rule__DocumentationCS__Group__1 : rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 ;
    public final void rule__DocumentationCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9291:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
            // InternalOCLinEcore.g:9292:2: rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_44);
            rule__DocumentationCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__1"


    // $ANTLR start "rule__DocumentationCS__Group__1__Impl"
    // InternalOCLinEcore.g:9299:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
    public final void rule__DocumentationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9303:1: ( ( 'documentation' ) )
            // InternalOCLinEcore.g:9304:1: ( 'documentation' )
            {
            // InternalOCLinEcore.g:9304:1: ( 'documentation' )
            // InternalOCLinEcore.g:9305:1: 'documentation'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getDocumentationKeyword_1());
            }
            match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getDocumentationKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__1__Impl"


    // $ANTLR start "rule__DocumentationCS__Group__2"
    // InternalOCLinEcore.g:9318:1: rule__DocumentationCS__Group__2 : rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 ;
    public final void rule__DocumentationCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9322:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
            // InternalOCLinEcore.g:9323:2: rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_44);
            rule__DocumentationCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__2"


    // $ANTLR start "rule__DocumentationCS__Group__2__Impl"
    // InternalOCLinEcore.g:9330:1: rule__DocumentationCS__Group__2__Impl : ( ( rule__DocumentationCS__ValueAssignment_2 )? ) ;
    public final void rule__DocumentationCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9334:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
            // InternalOCLinEcore.g:9335:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
            {
            // InternalOCLinEcore.g:9335:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
            // InternalOCLinEcore.g:9336:1: ( rule__DocumentationCS__ValueAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getValueAssignment_2());
            }
            // InternalOCLinEcore.g:9337:1: ( rule__DocumentationCS__ValueAssignment_2 )?
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt114=1;
            }
            switch (alt114) {
                case 1 :
                    // InternalOCLinEcore.g:9337:2: rule__DocumentationCS__ValueAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DocumentationCS__ValueAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getValueAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__2__Impl"


    // $ANTLR start "rule__DocumentationCS__Group__3"
    // InternalOCLinEcore.g:9347:1: rule__DocumentationCS__Group__3 : rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 ;
    public final void rule__DocumentationCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9351:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
            // InternalOCLinEcore.g:9352:2: rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_44);
            rule__DocumentationCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__3"


    // $ANTLR start "rule__DocumentationCS__Group__3__Impl"
    // InternalOCLinEcore.g:9359:1: rule__DocumentationCS__Group__3__Impl : ( ( rule__DocumentationCS__Group_3__0 )? ) ;
    public final void rule__DocumentationCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9363:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:9364:1: ( ( rule__DocumentationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:9364:1: ( ( rule__DocumentationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:9365:1: ( rule__DocumentationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:9366:1: ( rule__DocumentationCS__Group_3__0 )?
            int alt115=2;
            int LA115_0 = input.LA(1);

            if ( (LA115_0==102) ) {
                alt115=1;
            }
            switch (alt115) {
                case 1 :
                    // InternalOCLinEcore.g:9366:2: rule__DocumentationCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__DocumentationCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__3__Impl"


    // $ANTLR start "rule__DocumentationCS__Group__4"
    // InternalOCLinEcore.g:9376:1: rule__DocumentationCS__Group__4 : rule__DocumentationCS__Group__4__Impl ;
    public final void rule__DocumentationCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9380:1: ( rule__DocumentationCS__Group__4__Impl )
            // InternalOCLinEcore.g:9381:2: rule__DocumentationCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__4"


    // $ANTLR start "rule__DocumentationCS__Group__4__Impl"
    // InternalOCLinEcore.g:9387:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
    public final void rule__DocumentationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9391:1: ( ( ';' ) )
            // InternalOCLinEcore.g:9392:1: ( ';' )
            {
            // InternalOCLinEcore.g:9392:1: ( ';' )
            // InternalOCLinEcore.g:9393:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getSemicolonKeyword_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getSemicolonKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group__4__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3__0"
    // InternalOCLinEcore.g:9416:1: rule__DocumentationCS__Group_3__0 : rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 ;
    public final void rule__DocumentationCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9420:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
            // InternalOCLinEcore.g:9421:2: rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__DocumentationCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__0"


    // $ANTLR start "rule__DocumentationCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:9428:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
    public final void rule__DocumentationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9432:1: ( ( '(' ) )
            // InternalOCLinEcore.g:9433:1: ( '(' )
            {
            // InternalOCLinEcore.g:9433:1: ( '(' )
            // InternalOCLinEcore.g:9434:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__0__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3__1"
    // InternalOCLinEcore.g:9447:1: rule__DocumentationCS__Group_3__1 : rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 ;
    public final void rule__DocumentationCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9451:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
            // InternalOCLinEcore.g:9452:2: rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__DocumentationCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__1"


    // $ANTLR start "rule__DocumentationCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:9459:1: rule__DocumentationCS__Group_3__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) ;
    public final void rule__DocumentationCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9463:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:9464:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:9464:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
            // InternalOCLinEcore.g:9465:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_1());
            }
            // InternalOCLinEcore.g:9466:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
            // InternalOCLinEcore.g:9466:2: rule__DocumentationCS__OwnedDetailsAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__OwnedDetailsAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__1__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3__2"
    // InternalOCLinEcore.g:9476:1: rule__DocumentationCS__Group_3__2 : rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 ;
    public final void rule__DocumentationCS__Group_3__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9480:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
            // InternalOCLinEcore.g:9481:2: rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__DocumentationCS__Group_3__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__2"


    // $ANTLR start "rule__DocumentationCS__Group_3__2__Impl"
    // InternalOCLinEcore.g:9488:1: rule__DocumentationCS__Group_3__2__Impl : ( ( rule__DocumentationCS__Group_3_2__0 )* ) ;
    public final void rule__DocumentationCS__Group_3__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9492:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
            // InternalOCLinEcore.g:9493:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
            {
            // InternalOCLinEcore.g:9493:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
            // InternalOCLinEcore.g:9494:1: ( rule__DocumentationCS__Group_3_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getGroup_3_2());
            }
            // InternalOCLinEcore.g:9495:1: ( rule__DocumentationCS__Group_3_2__0 )*
            loop116:
            do {
                int alt116=2;
                int LA116_0 = input.LA(1);

                if ( (LA116_0==105) ) {
                    alt116=1;
                }


                switch (alt116) {
            	case 1 :
            	    // InternalOCLinEcore.g:9495:2: rule__DocumentationCS__Group_3_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__DocumentationCS__Group_3_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getGroup_3_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__2__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3__3"
    // InternalOCLinEcore.g:9505:1: rule__DocumentationCS__Group_3__3 : rule__DocumentationCS__Group_3__3__Impl ;
    public final void rule__DocumentationCS__Group_3__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9509:1: ( rule__DocumentationCS__Group_3__3__Impl )
            // InternalOCLinEcore.g:9510:2: rule__DocumentationCS__Group_3__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__3"


    // $ANTLR start "rule__DocumentationCS__Group_3__3__Impl"
    // InternalOCLinEcore.g:9516:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
    public final void rule__DocumentationCS__Group_3__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9520:1: ( ( ')' ) )
            // InternalOCLinEcore.g:9521:1: ( ')' )
            {
            // InternalOCLinEcore.g:9521:1: ( ')' )
            // InternalOCLinEcore.g:9522:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3__3__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3_2__0"
    // InternalOCLinEcore.g:9543:1: rule__DocumentationCS__Group_3_2__0 : rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 ;
    public final void rule__DocumentationCS__Group_3_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9547:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
            // InternalOCLinEcore.g:9548:2: rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__DocumentationCS__Group_3_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3_2__0"


    // $ANTLR start "rule__DocumentationCS__Group_3_2__0__Impl"
    // InternalOCLinEcore.g:9555:1: rule__DocumentationCS__Group_3_2__0__Impl : ( ',' ) ;
    public final void rule__DocumentationCS__Group_3_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9559:1: ( ( ',' ) )
            // InternalOCLinEcore.g:9560:1: ( ',' )
            {
            // InternalOCLinEcore.g:9560:1: ( ',' )
            // InternalOCLinEcore.g:9561:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3_2__0__Impl"


    // $ANTLR start "rule__DocumentationCS__Group_3_2__1"
    // InternalOCLinEcore.g:9574:1: rule__DocumentationCS__Group_3_2__1 : rule__DocumentationCS__Group_3_2__1__Impl ;
    public final void rule__DocumentationCS__Group_3_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9578:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
            // InternalOCLinEcore.g:9579:2: rule__DocumentationCS__Group_3_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__Group_3_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3_2__1"


    // $ANTLR start "rule__DocumentationCS__Group_3_2__1__Impl"
    // InternalOCLinEcore.g:9585:1: rule__DocumentationCS__Group_3_2__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
    public final void rule__DocumentationCS__Group_3_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9589:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
            // InternalOCLinEcore.g:9590:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
            {
            // InternalOCLinEcore.g:9590:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
            // InternalOCLinEcore.g:9591:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }
            // InternalOCLinEcore.g:9592:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
            // InternalOCLinEcore.g:9592:2: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DocumentationCS__OwnedDetailsAssignment_3_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__Group_3_2__1__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__0"
    // InternalOCLinEcore.g:9606:1: rule__EnumerationCS__Group__0 : rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 ;
    public final void rule__EnumerationCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9610:1: ( rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 )
            // InternalOCLinEcore.g:9611:2: rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__EnumerationCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__0"


    // $ANTLR start "rule__EnumerationCS__Group__0__Impl"
    // InternalOCLinEcore.g:9618:1: rule__EnumerationCS__Group__0__Impl : ( 'enum' ) ;
    public final void rule__EnumerationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9622:1: ( ( 'enum' ) )
            // InternalOCLinEcore.g:9623:1: ( 'enum' )
            {
            // InternalOCLinEcore.g:9623:1: ( 'enum' )
            // InternalOCLinEcore.g:9624:1: 'enum'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());
            }
            match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__0__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__1"
    // InternalOCLinEcore.g:9637:1: rule__EnumerationCS__Group__1 : rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 ;
    public final void rule__EnumerationCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9641:1: ( rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 )
            // InternalOCLinEcore.g:9642:2: rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__EnumerationCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__1"


    // $ANTLR start "rule__EnumerationCS__Group__1__Impl"
    // InternalOCLinEcore.g:9649:1: rule__EnumerationCS__Group__1__Impl : ( ( rule__EnumerationCS__NameAssignment_1 ) ) ;
    public final void rule__EnumerationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9653:1: ( ( ( rule__EnumerationCS__NameAssignment_1 ) ) )
            // InternalOCLinEcore.g:9654:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:9654:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
            // InternalOCLinEcore.g:9655:1: ( rule__EnumerationCS__NameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getNameAssignment_1());
            }
            // InternalOCLinEcore.g:9656:1: ( rule__EnumerationCS__NameAssignment_1 )
            // InternalOCLinEcore.g:9656:2: rule__EnumerationCS__NameAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__NameAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getNameAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__1__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__2"
    // InternalOCLinEcore.g:9666:1: rule__EnumerationCS__Group__2 : rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 ;
    public final void rule__EnumerationCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9670:1: ( rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 )
            // InternalOCLinEcore.g:9671:2: rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__EnumerationCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__2"


    // $ANTLR start "rule__EnumerationCS__Group__2__Impl"
    // InternalOCLinEcore.g:9678:1: rule__EnumerationCS__Group__2__Impl : ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) ;
    public final void rule__EnumerationCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9682:1: ( ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) )
            // InternalOCLinEcore.g:9683:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
            {
            // InternalOCLinEcore.g:9683:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
            // InternalOCLinEcore.g:9684:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedSignatureAssignment_2());
            }
            // InternalOCLinEcore.g:9685:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( (LA117_0==68||LA117_0==102) ) {
                alt117=1;
            }
            switch (alt117) {
                case 1 :
                    // InternalOCLinEcore.g:9685:2: rule__EnumerationCS__OwnedSignatureAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__OwnedSignatureAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getOwnedSignatureAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__2__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__3"
    // InternalOCLinEcore.g:9695:1: rule__EnumerationCS__Group__3 : rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 ;
    public final void rule__EnumerationCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9699:1: ( rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 )
            // InternalOCLinEcore.g:9700:2: rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__EnumerationCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__3"


    // $ANTLR start "rule__EnumerationCS__Group__3__Impl"
    // InternalOCLinEcore.g:9707:1: rule__EnumerationCS__Group__3__Impl : ( ( rule__EnumerationCS__Group_3__0 )? ) ;
    public final void rule__EnumerationCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9711:1: ( ( ( rule__EnumerationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:9712:1: ( ( rule__EnumerationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:9712:1: ( ( rule__EnumerationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:9713:1: ( rule__EnumerationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:9714:1: ( rule__EnumerationCS__Group_3__0 )?
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( (LA118_0==104) ) {
                alt118=1;
            }
            switch (alt118) {
                case 1 :
                    // InternalOCLinEcore.g:9714:2: rule__EnumerationCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__3__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__4"
    // InternalOCLinEcore.g:9724:1: rule__EnumerationCS__Group__4 : rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 ;
    public final void rule__EnumerationCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9728:1: ( rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 )
            // InternalOCLinEcore.g:9729:2: rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_36);
            rule__EnumerationCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__4"


    // $ANTLR start "rule__EnumerationCS__Group__4__Impl"
    // InternalOCLinEcore.g:9736:1: rule__EnumerationCS__Group__4__Impl : ( ( rule__EnumerationCS__Group_4__0 )? ) ;
    public final void rule__EnumerationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9740:1: ( ( ( rule__EnumerationCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:9741:1: ( ( rule__EnumerationCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:9741:1: ( ( rule__EnumerationCS__Group_4__0 )? )
            // InternalOCLinEcore.g:9742:1: ( rule__EnumerationCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:9743:1: ( rule__EnumerationCS__Group_4__0 )?
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==106) ) {
                int LA119_1 = input.LA(2);

                if ( (LA119_1==53||LA119_1==59) ) {
                    alt119=1;
                }
                else if ( (LA119_1==107) ) {
                    int LA119_4 = input.LA(3);

                    if ( (LA119_4==52||LA119_4==106) ) {
                        alt119=1;
                    }
                }
            }
            switch (alt119) {
                case 1 :
                    // InternalOCLinEcore.g:9743:2: rule__EnumerationCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__4__Impl"


    // $ANTLR start "rule__EnumerationCS__Group__5"
    // InternalOCLinEcore.g:9753:1: rule__EnumerationCS__Group__5 : rule__EnumerationCS__Group__5__Impl ;
    public final void rule__EnumerationCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9757:1: ( rule__EnumerationCS__Group__5__Impl )
            // InternalOCLinEcore.g:9758:2: rule__EnumerationCS__Group__5__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__5"


    // $ANTLR start "rule__EnumerationCS__Group__5__Impl"
    // InternalOCLinEcore.g:9764:1: rule__EnumerationCS__Group__5__Impl : ( ( rule__EnumerationCS__Alternatives_5 ) ) ;
    public final void rule__EnumerationCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9768:1: ( ( ( rule__EnumerationCS__Alternatives_5 ) ) )
            // InternalOCLinEcore.g:9769:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
            {
            // InternalOCLinEcore.g:9769:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
            // InternalOCLinEcore.g:9770:1: ( rule__EnumerationCS__Alternatives_5 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_5());
            }
            // InternalOCLinEcore.g:9771:1: ( rule__EnumerationCS__Alternatives_5 )
            // InternalOCLinEcore.g:9771:2: rule__EnumerationCS__Alternatives_5
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Alternatives_5();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getAlternatives_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group__5__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_3__0"
    // InternalOCLinEcore.g:9793:1: rule__EnumerationCS__Group_3__0 : rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 ;
    public final void rule__EnumerationCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9797:1: ( rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 )
            // InternalOCLinEcore.g:9798:2: rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__EnumerationCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_3__0"


    // $ANTLR start "rule__EnumerationCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:9805:1: rule__EnumerationCS__Group_3__0__Impl : ( ':' ) ;
    public final void rule__EnumerationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9809:1: ( ( ':' ) )
            // InternalOCLinEcore.g:9810:1: ( ':' )
            {
            // InternalOCLinEcore.g:9810:1: ( ':' )
            // InternalOCLinEcore.g:9811:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_3__0__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_3__1"
    // InternalOCLinEcore.g:9824:1: rule__EnumerationCS__Group_3__1 : rule__EnumerationCS__Group_3__1__Impl ;
    public final void rule__EnumerationCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9828:1: ( rule__EnumerationCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:9829:2: rule__EnumerationCS__Group_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_3__1"


    // $ANTLR start "rule__EnumerationCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:9835:1: rule__EnumerationCS__Group_3__1__Impl : ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) ;
    public final void rule__EnumerationCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9839:1: ( ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:9840:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:9840:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
            // InternalOCLinEcore.g:9841:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getInstanceClassNameAssignment_3_1());
            }
            // InternalOCLinEcore.g:9842:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
            // InternalOCLinEcore.g:9842:2: rule__EnumerationCS__InstanceClassNameAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__InstanceClassNameAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getInstanceClassNameAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_3__1__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_4__0"
    // InternalOCLinEcore.g:9856:1: rule__EnumerationCS__Group_4__0 : rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 ;
    public final void rule__EnumerationCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9860:1: ( rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 )
            // InternalOCLinEcore.g:9861:2: rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_37);
            rule__EnumerationCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__0"


    // $ANTLR start "rule__EnumerationCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:9868:1: rule__EnumerationCS__Group_4__0__Impl : ( '{' ) ;
    public final void rule__EnumerationCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9872:1: ( ( '{' ) )
            // InternalOCLinEcore.g:9873:1: ( '{' )
            {
            // InternalOCLinEcore.g:9873:1: ( '{' )
            // InternalOCLinEcore.g:9874:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__0__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_4__1"
    // InternalOCLinEcore.g:9887:1: rule__EnumerationCS__Group_4__1 : rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 ;
    public final void rule__EnumerationCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9891:1: ( rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 )
            // InternalOCLinEcore.g:9892:2: rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2
            {
            pushFollow(FollowSets000.FOLLOW_37);
            rule__EnumerationCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_4__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__1"


    // $ANTLR start "rule__EnumerationCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:9899:1: rule__EnumerationCS__Group_4__1__Impl : ( ( rule__EnumerationCS__Alternatives_4_1 )? ) ;
    public final void rule__EnumerationCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9903:1: ( ( ( rule__EnumerationCS__Alternatives_4_1 )? ) )
            // InternalOCLinEcore.g:9904:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
            {
            // InternalOCLinEcore.g:9904:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
            // InternalOCLinEcore.g:9905:1: ( rule__EnumerationCS__Alternatives_4_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_4_1());
            }
            // InternalOCLinEcore.g:9906:1: ( rule__EnumerationCS__Alternatives_4_1 )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==53||LA120_0==59) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // InternalOCLinEcore.g:9906:2: rule__EnumerationCS__Alternatives_4_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationCS__Alternatives_4_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getAlternatives_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__1__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_4__2"
    // InternalOCLinEcore.g:9916:1: rule__EnumerationCS__Group_4__2 : rule__EnumerationCS__Group_4__2__Impl ;
    public final void rule__EnumerationCS__Group_4__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9920:1: ( rule__EnumerationCS__Group_4__2__Impl )
            // InternalOCLinEcore.g:9921:2: rule__EnumerationCS__Group_4__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_4__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__2"


    // $ANTLR start "rule__EnumerationCS__Group_4__2__Impl"
    // InternalOCLinEcore.g:9927:1: rule__EnumerationCS__Group_4__2__Impl : ( '}' ) ;
    public final void rule__EnumerationCS__Group_4__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9931:1: ( ( '}' ) )
            // InternalOCLinEcore.g:9932:1: ( '}' )
            {
            // InternalOCLinEcore.g:9932:1: ( '}' )
            // InternalOCLinEcore.g:9933:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_4__2__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__0"
    // InternalOCLinEcore.g:9952:1: rule__EnumerationCS__Group_5_0__0 : rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 ;
    public final void rule__EnumerationCS__Group_5_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9956:1: ( rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 )
            // InternalOCLinEcore.g:9957:2: rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1
            {
            pushFollow(FollowSets000.FOLLOW_45);
            rule__EnumerationCS__Group_5_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_5_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__0"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__0__Impl"
    // InternalOCLinEcore.g:9964:1: rule__EnumerationCS__Group_5_0__0__Impl : ( '{' ) ;
    public final void rule__EnumerationCS__Group_5_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9968:1: ( ( '{' ) )
            // InternalOCLinEcore.g:9969:1: ( '{' )
            {
            // InternalOCLinEcore.g:9969:1: ( '{' )
            // InternalOCLinEcore.g:9970:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__0__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__1"
    // InternalOCLinEcore.g:9983:1: rule__EnumerationCS__Group_5_0__1 : rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 ;
    public final void rule__EnumerationCS__Group_5_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9987:1: ( rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 )
            // InternalOCLinEcore.g:9988:2: rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2
            {
            pushFollow(FollowSets000.FOLLOW_45);
            rule__EnumerationCS__Group_5_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_5_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__1"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__1__Impl"
    // InternalOCLinEcore.g:9995:1: rule__EnumerationCS__Group_5_0__1__Impl : ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) ;
    public final void rule__EnumerationCS__Group_5_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9999:1: ( ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) )
            // InternalOCLinEcore.g:10000:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
            {
            // InternalOCLinEcore.g:10000:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
            // InternalOCLinEcore.g:10001:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_5_0_1());
            }
            // InternalOCLinEcore.g:10002:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
            loop121:
            do {
                int alt121=2;
                int LA121_0 = input.LA(1);

                if ( ((LA121_0>=RULE_SIMPLE_ID && LA121_0<=RULE_ESCAPED_ID)||(LA121_0>=17 && LA121_0<=51)||(LA121_0>=54 && LA121_0<=57)||LA121_0==60) ) {
                    alt121=1;
                }


                switch (alt121) {
            	case 1 :
            	    // InternalOCLinEcore.g:10002:2: rule__EnumerationCS__Alternatives_5_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_46);
            	    rule__EnumerationCS__Alternatives_5_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getAlternatives_5_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__1__Impl"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__2"
    // InternalOCLinEcore.g:10012:1: rule__EnumerationCS__Group_5_0__2 : rule__EnumerationCS__Group_5_0__2__Impl ;
    public final void rule__EnumerationCS__Group_5_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10016:1: ( rule__EnumerationCS__Group_5_0__2__Impl )
            // InternalOCLinEcore.g:10017:2: rule__EnumerationCS__Group_5_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationCS__Group_5_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__2"


    // $ANTLR start "rule__EnumerationCS__Group_5_0__2__Impl"
    // InternalOCLinEcore.g:10023:1: rule__EnumerationCS__Group_5_0__2__Impl : ( '}' ) ;
    public final void rule__EnumerationCS__Group_5_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10027:1: ( ( '}' ) )
            // InternalOCLinEcore.g:10028:1: ( '}' )
            {
            // InternalOCLinEcore.g:10028:1: ( '}' )
            // InternalOCLinEcore.g:10029:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__Group_5_0__2__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__0"
    // InternalOCLinEcore.g:10048:1: rule__EnumerationLiteralCS__Group__0 : rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 ;
    public final void rule__EnumerationLiteralCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10052:1: ( rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 )
            // InternalOCLinEcore.g:10053:2: rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__EnumerationLiteralCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__0__Impl"
    // InternalOCLinEcore.g:10060:1: rule__EnumerationLiteralCS__Group__0__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) ;
    public final void rule__EnumerationLiteralCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10064:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) )
            // InternalOCLinEcore.g:10065:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
            {
            // InternalOCLinEcore.g:10065:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
            // InternalOCLinEcore.g:10066:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:10067:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
            // InternalOCLinEcore.g:10067:2: rule__EnumerationLiteralCS__Alternatives_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Alternatives_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__0__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__1"
    // InternalOCLinEcore.g:10077:1: rule__EnumerationLiteralCS__Group__1 : rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 ;
    public final void rule__EnumerationLiteralCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10081:1: ( rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 )
            // InternalOCLinEcore.g:10082:2: rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__EnumerationLiteralCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__1__Impl"
    // InternalOCLinEcore.g:10089:1: rule__EnumerationLiteralCS__Group__1__Impl : ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) ;
    public final void rule__EnumerationLiteralCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10093:1: ( ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:10094:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:10094:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
            // InternalOCLinEcore.g:10095:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:10096:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
            int alt122=2;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==104) ) {
                alt122=1;
            }
            switch (alt122) {
                case 1 :
                    // InternalOCLinEcore.g:10096:2: rule__EnumerationLiteralCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__1__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__2"
    // InternalOCLinEcore.g:10106:1: rule__EnumerationLiteralCS__Group__2 : rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 ;
    public final void rule__EnumerationLiteralCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10110:1: ( rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 )
            // InternalOCLinEcore.g:10111:2: rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__EnumerationLiteralCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__2"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__2__Impl"
    // InternalOCLinEcore.g:10118:1: rule__EnumerationLiteralCS__Group__2__Impl : ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) ;
    public final void rule__EnumerationLiteralCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10122:1: ( ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:10123:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:10123:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
            // InternalOCLinEcore.g:10124:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:10125:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
            int alt123=2;
            int LA123_0 = input.LA(1);

            if ( (LA123_0==71) ) {
                alt123=1;
            }
            switch (alt123) {
                case 1 :
                    // InternalOCLinEcore.g:10125:2: rule__EnumerationLiteralCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__2__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__3"
    // InternalOCLinEcore.g:10135:1: rule__EnumerationLiteralCS__Group__3 : rule__EnumerationLiteralCS__Group__3__Impl ;
    public final void rule__EnumerationLiteralCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10139:1: ( rule__EnumerationLiteralCS__Group__3__Impl )
            // InternalOCLinEcore.g:10140:2: rule__EnumerationLiteralCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__3"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__3__Impl"
    // InternalOCLinEcore.g:10146:1: rule__EnumerationLiteralCS__Group__3__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) ;
    public final void rule__EnumerationLiteralCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10150:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) )
            // InternalOCLinEcore.g:10151:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
            {
            // InternalOCLinEcore.g:10151:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
            // InternalOCLinEcore.g:10152:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_3());
            }
            // InternalOCLinEcore.g:10153:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
            // InternalOCLinEcore.g:10153:2: rule__EnumerationLiteralCS__Alternatives_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Alternatives_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group__3__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__0"
    // InternalOCLinEcore.g:10171:1: rule__EnumerationLiteralCS__Group_0_0__0 : rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 ;
    public final void rule__EnumerationLiteralCS__Group_0_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10175:1: ( rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 )
            // InternalOCLinEcore.g:10176:2: rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__EnumerationLiteralCS__Group_0_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_0_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_0_0__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__0__Impl"
    // InternalOCLinEcore.g:10183:1: rule__EnumerationLiteralCS__Group_0_0__0__Impl : ( 'literal' ) ;
    public final void rule__EnumerationLiteralCS__Group_0_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10187:1: ( ( 'literal' ) )
            // InternalOCLinEcore.g:10188:1: ( 'literal' )
            {
            // InternalOCLinEcore.g:10188:1: ( 'literal' )
            // InternalOCLinEcore.g:10189:1: 'literal'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());
            }
            match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_0_0__0__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__1"
    // InternalOCLinEcore.g:10202:1: rule__EnumerationLiteralCS__Group_0_0__1 : rule__EnumerationLiteralCS__Group_0_0__1__Impl ;
    public final void rule__EnumerationLiteralCS__Group_0_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10206:1: ( rule__EnumerationLiteralCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:10207:2: rule__EnumerationLiteralCS__Group_0_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_0_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_0_0__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__1__Impl"
    // InternalOCLinEcore.g:10213:1: rule__EnumerationLiteralCS__Group_0_0__1__Impl : ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) ;
    public final void rule__EnumerationLiteralCS__Group_0_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10217:1: ( ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) )
            // InternalOCLinEcore.g:10218:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
            {
            // InternalOCLinEcore.g:10218:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
            // InternalOCLinEcore.g:10219:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:10220:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
            // InternalOCLinEcore.g:10220:2: rule__EnumerationLiteralCS__NameAssignment_0_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__NameAssignment_0_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_0_0__1__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_1__0"
    // InternalOCLinEcore.g:10234:1: rule__EnumerationLiteralCS__Group_1__0 : rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 ;
    public final void rule__EnumerationLiteralCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10238:1: ( rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 )
            // InternalOCLinEcore.g:10239:2: rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__EnumerationLiteralCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_1__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:10246:1: rule__EnumerationLiteralCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__EnumerationLiteralCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10250:1: ( ( ':' ) )
            // InternalOCLinEcore.g:10251:1: ( ':' )
            {
            // InternalOCLinEcore.g:10251:1: ( ':' )
            // InternalOCLinEcore.g:10252:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getColonKeyword_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_1__0__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_1__1"
    // InternalOCLinEcore.g:10265:1: rule__EnumerationLiteralCS__Group_1__1 : rule__EnumerationLiteralCS__Group_1__1__Impl ;
    public final void rule__EnumerationLiteralCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10269:1: ( rule__EnumerationLiteralCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:10270:2: rule__EnumerationLiteralCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_1__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:10276:1: rule__EnumerationLiteralCS__Group_1__1__Impl : ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) ;
    public final void rule__EnumerationLiteralCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10280:1: ( ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:10281:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:10281:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
            // InternalOCLinEcore.g:10282:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralAssignment_1_1());
            }
            // InternalOCLinEcore.g:10283:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
            // InternalOCLinEcore.g:10283:2: rule__EnumerationLiteralCS__LiteralAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__LiteralAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getLiteralAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_1__1__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2__0"
    // InternalOCLinEcore.g:10297:1: rule__EnumerationLiteralCS__Group_2__0 : rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 ;
    public final void rule__EnumerationLiteralCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10301:1: ( rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 )
            // InternalOCLinEcore.g:10302:2: rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_47);
            rule__EnumerationLiteralCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_2__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:10309:1: rule__EnumerationLiteralCS__Group_2__0__Impl : ( '=' ) ;
    public final void rule__EnumerationLiteralCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10313:1: ( ( '=' ) )
            // InternalOCLinEcore.g:10314:1: ( '=' )
            {
            // InternalOCLinEcore.g:10314:1: ( '=' )
            // InternalOCLinEcore.g:10315:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_2_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_2__0__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2__1"
    // InternalOCLinEcore.g:10328:1: rule__EnumerationLiteralCS__Group_2__1 : rule__EnumerationLiteralCS__Group_2__1__Impl ;
    public final void rule__EnumerationLiteralCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10332:1: ( rule__EnumerationLiteralCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:10333:2: rule__EnumerationLiteralCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_2__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:10339:1: rule__EnumerationLiteralCS__Group_2__1__Impl : ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) ;
    public final void rule__EnumerationLiteralCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10343:1: ( ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:10344:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:10344:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
            // InternalOCLinEcore.g:10345:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getValueAssignment_2_1());
            }
            // InternalOCLinEcore.g:10346:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
            // InternalOCLinEcore.g:10346:2: rule__EnumerationLiteralCS__ValueAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__ValueAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getValueAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_2__1__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__0"
    // InternalOCLinEcore.g:10360:1: rule__EnumerationLiteralCS__Group_3_0__0 : rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 ;
    public final void rule__EnumerationLiteralCS__Group_3_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10364:1: ( rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 )
            // InternalOCLinEcore.g:10365:2: rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1
            {
            pushFollow(FollowSets000.FOLLOW_48);
            rule__EnumerationLiteralCS__Group_3_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_3_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__0__Impl"
    // InternalOCLinEcore.g:10372:1: rule__EnumerationLiteralCS__Group_3_0__0__Impl : ( '{' ) ;
    public final void rule__EnumerationLiteralCS__Group_3_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10376:1: ( ( '{' ) )
            // InternalOCLinEcore.g:10377:1: ( '{' )
            {
            // InternalOCLinEcore.g:10377:1: ( '{' )
            // InternalOCLinEcore.g:10378:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_3_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_3_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__0__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__1"
    // InternalOCLinEcore.g:10391:1: rule__EnumerationLiteralCS__Group_3_0__1 : rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 ;
    public final void rule__EnumerationLiteralCS__Group_3_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10395:1: ( rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 )
            // InternalOCLinEcore.g:10396:2: rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2
            {
            pushFollow(FollowSets000.FOLLOW_48);
            rule__EnumerationLiteralCS__Group_3_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_3_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__1__Impl"
    // InternalOCLinEcore.g:10403:1: rule__EnumerationLiteralCS__Group_3_0__1__Impl : ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) ;
    public final void rule__EnumerationLiteralCS__Group_3_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10407:1: ( ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) )
            // InternalOCLinEcore.g:10408:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
            {
            // InternalOCLinEcore.g:10408:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
            // InternalOCLinEcore.g:10409:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAssignment_3_0_1());
            }
            // InternalOCLinEcore.g:10410:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
            loop124:
            do {
                int alt124=2;
                int LA124_0 = input.LA(1);

                if ( ((LA124_0>=54 && LA124_0<=55)||LA124_0==60) ) {
                    alt124=1;
                }


                switch (alt124) {
            	case 1 :
            	    // InternalOCLinEcore.g:10410:2: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_49);
            	    rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAssignment_3_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__1__Impl"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__2"
    // InternalOCLinEcore.g:10420:1: rule__EnumerationLiteralCS__Group_3_0__2 : rule__EnumerationLiteralCS__Group_3_0__2__Impl ;
    public final void rule__EnumerationLiteralCS__Group_3_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10424:1: ( rule__EnumerationLiteralCS__Group_3_0__2__Impl )
            // InternalOCLinEcore.g:10425:2: rule__EnumerationLiteralCS__Group_3_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group_3_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__2"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__2__Impl"
    // InternalOCLinEcore.g:10431:1: rule__EnumerationLiteralCS__Group_3_0__2__Impl : ( '}' ) ;
    public final void rule__EnumerationLiteralCS__Group_3_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10435:1: ( ( '}' ) )
            // InternalOCLinEcore.g:10436:1: ( '}' )
            {
            // InternalOCLinEcore.g:10436:1: ( '}' )
            // InternalOCLinEcore.g:10437:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_3_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_3_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__Group_3_0__2__Impl"


    // $ANTLR start "rule__ImportCS__Group__0"
    // InternalOCLinEcore.g:10456:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
    public final void rule__ImportCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10460:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
            // InternalOCLinEcore.g:10461:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__ImportCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__0"


    // $ANTLR start "rule__ImportCS__Group__0__Impl"
    // InternalOCLinEcore.g:10468:1: rule__ImportCS__Group__0__Impl : ( ( rule__ImportCS__Alternatives_0 ) ) ;
    public final void rule__ImportCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10472:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
            // InternalOCLinEcore.g:10473:1: ( ( rule__ImportCS__Alternatives_0 ) )
            {
            // InternalOCLinEcore.g:10473:1: ( ( rule__ImportCS__Alternatives_0 ) )
            // InternalOCLinEcore.g:10474:1: ( rule__ImportCS__Alternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:10475:1: ( rule__ImportCS__Alternatives_0 )
            // InternalOCLinEcore.g:10475:2: rule__ImportCS__Alternatives_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Alternatives_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__0__Impl"


    // $ANTLR start "rule__ImportCS__Group__1"
    // InternalOCLinEcore.g:10485:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
    public final void rule__ImportCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10489:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
            // InternalOCLinEcore.g:10490:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__ImportCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__1"


    // $ANTLR start "rule__ImportCS__Group__1__Impl"
    // InternalOCLinEcore.g:10497:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
    public final void rule__ImportCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10501:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:10502:1: ( ( rule__ImportCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:10502:1: ( ( rule__ImportCS__Group_1__0 )? )
            // InternalOCLinEcore.g:10503:1: ( rule__ImportCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:10504:1: ( rule__ImportCS__Group_1__0 )?
            int alt125=2;
            alt125 = dfa125.predict(input);
            switch (alt125) {
                case 1 :
                    // InternalOCLinEcore.g:10504:2: rule__ImportCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImportCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__1__Impl"


    // $ANTLR start "rule__ImportCS__Group__2"
    // InternalOCLinEcore.g:10514:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
    public final void rule__ImportCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10518:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
            // InternalOCLinEcore.g:10519:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_50);
            rule__ImportCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__2"


    // $ANTLR start "rule__ImportCS__Group__2__Impl"
    // InternalOCLinEcore.g:10526:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
    public final void rule__ImportCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10530:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
            // InternalOCLinEcore.g:10531:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:10531:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
            // InternalOCLinEcore.g:10532:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
            }
            // InternalOCLinEcore.g:10533:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
            // InternalOCLinEcore.g:10533:2: rule__ImportCS__OwnedPathNameAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__OwnedPathNameAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__2__Impl"


    // $ANTLR start "rule__ImportCS__Group__3"
    // InternalOCLinEcore.g:10543:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 ;
    public final void rule__ImportCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10547:1: ( rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 )
            // InternalOCLinEcore.g:10548:2: rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_50);
            rule__ImportCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__3"


    // $ANTLR start "rule__ImportCS__Group__3__Impl"
    // InternalOCLinEcore.g:10555:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
    public final void rule__ImportCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10559:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
            // InternalOCLinEcore.g:10560:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
            {
            // InternalOCLinEcore.g:10560:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
            // InternalOCLinEcore.g:10561:1: ( rule__ImportCS__IsAllAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
            }
            // InternalOCLinEcore.g:10562:1: ( rule__ImportCS__IsAllAssignment_3 )?
            int alt126=2;
            int LA126_0 = input.LA(1);

            if ( (LA126_0==136) ) {
                alt126=1;
            }
            switch (alt126) {
                case 1 :
                    // InternalOCLinEcore.g:10562:2: rule__ImportCS__IsAllAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImportCS__IsAllAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__3__Impl"


    // $ANTLR start "rule__ImportCS__Group__4"
    // InternalOCLinEcore.g:10572:1: rule__ImportCS__Group__4 : rule__ImportCS__Group__4__Impl ;
    public final void rule__ImportCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10576:1: ( rule__ImportCS__Group__4__Impl )
            // InternalOCLinEcore.g:10577:2: rule__ImportCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__4"


    // $ANTLR start "rule__ImportCS__Group__4__Impl"
    // InternalOCLinEcore.g:10583:1: rule__ImportCS__Group__4__Impl : ( ';' ) ;
    public final void rule__ImportCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10587:1: ( ( ';' ) )
            // InternalOCLinEcore.g:10588:1: ( ';' )
            {
            // InternalOCLinEcore.g:10588:1: ( ';' )
            // InternalOCLinEcore.g:10589:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getSemicolonKeyword_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getSemicolonKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group__4__Impl"


    // $ANTLR start "rule__ImportCS__Group_1__0"
    // InternalOCLinEcore.g:10612:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
    public final void rule__ImportCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10616:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
            // InternalOCLinEcore.g:10617:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__ImportCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group_1__0"


    // $ANTLR start "rule__ImportCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:10624:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
    public final void rule__ImportCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10628:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:10629:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:10629:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:10630:1: ( rule__ImportCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:10631:1: ( rule__ImportCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:10631:2: rule__ImportCS__NameAssignment_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__NameAssignment_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group_1__0__Impl"


    // $ANTLR start "rule__ImportCS__Group_1__1"
    // InternalOCLinEcore.g:10641:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
    public final void rule__ImportCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10645:1: ( rule__ImportCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:10646:2: rule__ImportCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImportCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group_1__1"


    // $ANTLR start "rule__ImportCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:10652:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
    public final void rule__ImportCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10656:1: ( ( ':' ) )
            // InternalOCLinEcore.g:10657:1: ( ':' )
            {
            // InternalOCLinEcore.g:10657:1: ( ':' )
            // InternalOCLinEcore.g:10658:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__Group_1__1__Impl"


    // $ANTLR start "rule__ModelElementRefCS__Group__0"
    // InternalOCLinEcore.g:10675:1: rule__ModelElementRefCS__Group__0 : rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 ;
    public final void rule__ModelElementRefCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10679:1: ( rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 )
            // InternalOCLinEcore.g:10680:2: rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__ModelElementRefCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementRefCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__0"


    // $ANTLR start "rule__ModelElementRefCS__Group__0__Impl"
    // InternalOCLinEcore.g:10687:1: rule__ModelElementRefCS__Group__0__Impl : ( 'reference' ) ;
    public final void rule__ModelElementRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10691:1: ( ( 'reference' ) )
            // InternalOCLinEcore.g:10692:1: ( 'reference' )
            {
            // InternalOCLinEcore.g:10692:1: ( 'reference' )
            // InternalOCLinEcore.g:10693:1: 'reference'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getReferenceKeyword_0());
            }
            match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementRefCSAccess().getReferenceKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__0__Impl"


    // $ANTLR start "rule__ModelElementRefCS__Group__1"
    // InternalOCLinEcore.g:10706:1: rule__ModelElementRefCS__Group__1 : rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 ;
    public final void rule__ModelElementRefCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10710:1: ( rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 )
            // InternalOCLinEcore.g:10711:2: rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_52);
            rule__ModelElementRefCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementRefCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__1"


    // $ANTLR start "rule__ModelElementRefCS__Group__1__Impl"
    // InternalOCLinEcore.g:10718:1: rule__ModelElementRefCS__Group__1__Impl : ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) ;
    public final void rule__ModelElementRefCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10722:1: ( ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) )
            // InternalOCLinEcore.g:10723:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:10723:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
            // InternalOCLinEcore.g:10724:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getOwnedPathNameAssignment_1());
            }
            // InternalOCLinEcore.g:10725:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
            // InternalOCLinEcore.g:10725:2: rule__ModelElementRefCS__OwnedPathNameAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementRefCS__OwnedPathNameAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementRefCSAccess().getOwnedPathNameAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__1__Impl"


    // $ANTLR start "rule__ModelElementRefCS__Group__2"
    // InternalOCLinEcore.g:10735:1: rule__ModelElementRefCS__Group__2 : rule__ModelElementRefCS__Group__2__Impl ;
    public final void rule__ModelElementRefCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10739:1: ( rule__ModelElementRefCS__Group__2__Impl )
            // InternalOCLinEcore.g:10740:2: rule__ModelElementRefCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ModelElementRefCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__2"


    // $ANTLR start "rule__ModelElementRefCS__Group__2__Impl"
    // InternalOCLinEcore.g:10746:1: rule__ModelElementRefCS__Group__2__Impl : ( ';' ) ;
    public final void rule__ModelElementRefCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10750:1: ( ( ';' ) )
            // InternalOCLinEcore.g:10751:1: ( ';' )
            {
            // InternalOCLinEcore.g:10751:1: ( ';' )
            // InternalOCLinEcore.g:10752:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getSemicolonKeyword_2());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementRefCSAccess().getSemicolonKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__Group__2__Impl"


    // $ANTLR start "rule__OperationCS__Group__0"
    // InternalOCLinEcore.g:10771:1: rule__OperationCS__Group__0 : rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 ;
    public final void rule__OperationCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10775:1: ( rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 )
            // InternalOCLinEcore.g:10776:2: rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_53);
            rule__OperationCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__0"


    // $ANTLR start "rule__OperationCS__Group__0__Impl"
    // InternalOCLinEcore.g:10783:1: rule__OperationCS__Group__0__Impl : ( ( rule__OperationCS__Alternatives_0 )? ) ;
    public final void rule__OperationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10787:1: ( ( ( rule__OperationCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:10788:1: ( ( rule__OperationCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:10788:1: ( ( rule__OperationCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:10789:1: ( rule__OperationCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:10790:1: ( rule__OperationCS__Alternatives_0 )?
            int alt127=2;
            int LA127_0 = input.LA(1);

            if ( (LA127_0==24||LA127_0==46) ) {
                alt127=1;
            }
            switch (alt127) {
                case 1 :
                    // InternalOCLinEcore.g:10790:2: rule__OperationCS__Alternatives_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Alternatives_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__0__Impl"


    // $ANTLR start "rule__OperationCS__Group__1"
    // InternalOCLinEcore.g:10800:1: rule__OperationCS__Group__1 : rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 ;
    public final void rule__OperationCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10804:1: ( rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 )
            // InternalOCLinEcore.g:10805:2: rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_54);
            rule__OperationCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__1"


    // $ANTLR start "rule__OperationCS__Group__1__Impl"
    // InternalOCLinEcore.g:10812:1: rule__OperationCS__Group__1__Impl : ( 'operation' ) ;
    public final void rule__OperationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10816:1: ( ( 'operation' ) )
            // InternalOCLinEcore.g:10817:1: ( 'operation' )
            {
            // InternalOCLinEcore.g:10817:1: ( 'operation' )
            // InternalOCLinEcore.g:10818:1: 'operation'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOperationKeyword_1());
            }
            match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOperationKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__1__Impl"


    // $ANTLR start "rule__OperationCS__Group__2"
    // InternalOCLinEcore.g:10831:1: rule__OperationCS__Group__2 : rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 ;
    public final void rule__OperationCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10835:1: ( rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 )
            // InternalOCLinEcore.g:10836:2: rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_54);
            rule__OperationCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__2"


    // $ANTLR start "rule__OperationCS__Group__2__Impl"
    // InternalOCLinEcore.g:10843:1: rule__OperationCS__Group__2__Impl : ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) ;
    public final void rule__OperationCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10847:1: ( ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) )
            // InternalOCLinEcore.g:10848:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
            {
            // InternalOCLinEcore.g:10848:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
            // InternalOCLinEcore.g:10849:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedSignatureAssignment_2());
            }
            // InternalOCLinEcore.g:10850:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==68||LA128_0==102) ) {
                alt128=1;
            }
            switch (alt128) {
                case 1 :
                    // InternalOCLinEcore.g:10850:2: rule__OperationCS__OwnedSignatureAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__OwnedSignatureAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedSignatureAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__2__Impl"


    // $ANTLR start "rule__OperationCS__Group__3"
    // InternalOCLinEcore.g:10860:1: rule__OperationCS__Group__3 : rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 ;
    public final void rule__OperationCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10864:1: ( rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 )
            // InternalOCLinEcore.g:10865:2: rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__OperationCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__3"


    // $ANTLR start "rule__OperationCS__Group__3__Impl"
    // InternalOCLinEcore.g:10872:1: rule__OperationCS__Group__3__Impl : ( ( rule__OperationCS__NameAssignment_3 ) ) ;
    public final void rule__OperationCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10876:1: ( ( ( rule__OperationCS__NameAssignment_3 ) ) )
            // InternalOCLinEcore.g:10877:1: ( ( rule__OperationCS__NameAssignment_3 ) )
            {
            // InternalOCLinEcore.g:10877:1: ( ( rule__OperationCS__NameAssignment_3 ) )
            // InternalOCLinEcore.g:10878:1: ( rule__OperationCS__NameAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getNameAssignment_3());
            }
            // InternalOCLinEcore.g:10879:1: ( rule__OperationCS__NameAssignment_3 )
            // InternalOCLinEcore.g:10879:2: rule__OperationCS__NameAssignment_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__NameAssignment_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getNameAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__3__Impl"


    // $ANTLR start "rule__OperationCS__Group__4"
    // InternalOCLinEcore.g:10889:1: rule__OperationCS__Group__4 : rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 ;
    public final void rule__OperationCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10893:1: ( rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 )
            // InternalOCLinEcore.g:10894:2: rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_55);
            rule__OperationCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__4"


    // $ANTLR start "rule__OperationCS__Group__4__Impl"
    // InternalOCLinEcore.g:10901:1: rule__OperationCS__Group__4__Impl : ( '(' ) ;
    public final void rule__OperationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10905:1: ( ( '(' ) )
            // InternalOCLinEcore.g:10906:1: ( '(' )
            {
            // InternalOCLinEcore.g:10906:1: ( '(' )
            // InternalOCLinEcore.g:10907:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__4__Impl"


    // $ANTLR start "rule__OperationCS__Group__5"
    // InternalOCLinEcore.g:10920:1: rule__OperationCS__Group__5 : rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 ;
    public final void rule__OperationCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10924:1: ( rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 )
            // InternalOCLinEcore.g:10925:2: rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_55);
            rule__OperationCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__5"


    // $ANTLR start "rule__OperationCS__Group__5__Impl"
    // InternalOCLinEcore.g:10932:1: rule__OperationCS__Group__5__Impl : ( ( rule__OperationCS__Group_5__0 )? ) ;
    public final void rule__OperationCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10936:1: ( ( ( rule__OperationCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:10937:1: ( ( rule__OperationCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:10937:1: ( ( rule__OperationCS__Group_5__0 )? )
            // InternalOCLinEcore.g:10938:1: ( rule__OperationCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:10939:1: ( rule__OperationCS__Group_5__0 )?
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( ((LA129_0>=RULE_SIMPLE_ID && LA129_0<=RULE_ESCAPED_ID)||(LA129_0>=17 && LA129_0<=51)||(LA129_0>=54 && LA129_0<=60)) ) {
                alt129=1;
            }
            switch (alt129) {
                case 1 :
                    // InternalOCLinEcore.g:10939:2: rule__OperationCS__Group_5__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__5__Impl"


    // $ANTLR start "rule__OperationCS__Group__6"
    // InternalOCLinEcore.g:10949:1: rule__OperationCS__Group__6 : rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 ;
    public final void rule__OperationCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10953:1: ( rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 )
            // InternalOCLinEcore.g:10954:2: rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_56);
            rule__OperationCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__7();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__6"


    // $ANTLR start "rule__OperationCS__Group__6__Impl"
    // InternalOCLinEcore.g:10961:1: rule__OperationCS__Group__6__Impl : ( ')' ) ;
    public final void rule__OperationCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10965:1: ( ( ')' ) )
            // InternalOCLinEcore.g:10966:1: ( ')' )
            {
            // InternalOCLinEcore.g:10966:1: ( ')' )
            // InternalOCLinEcore.g:10967:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__6__Impl"


    // $ANTLR start "rule__OperationCS__Group__7"
    // InternalOCLinEcore.g:10980:1: rule__OperationCS__Group__7 : rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 ;
    public final void rule__OperationCS__Group__7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10984:1: ( rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 )
            // InternalOCLinEcore.g:10985:2: rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8
            {
            pushFollow(FollowSets000.FOLLOW_56);
            rule__OperationCS__Group__7__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__8();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__7"


    // $ANTLR start "rule__OperationCS__Group__7__Impl"
    // InternalOCLinEcore.g:10992:1: rule__OperationCS__Group__7__Impl : ( ( rule__OperationCS__Group_7__0 )? ) ;
    public final void rule__OperationCS__Group__7__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10996:1: ( ( ( rule__OperationCS__Group_7__0 )? ) )
            // InternalOCLinEcore.g:10997:1: ( ( rule__OperationCS__Group_7__0 )? )
            {
            // InternalOCLinEcore.g:10997:1: ( ( rule__OperationCS__Group_7__0 )? )
            // InternalOCLinEcore.g:10998:1: ( rule__OperationCS__Group_7__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_7());
            }
            // InternalOCLinEcore.g:10999:1: ( rule__OperationCS__Group_7__0 )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==104) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalOCLinEcore.g:10999:2: rule__OperationCS__Group_7__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_7__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_7());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__7__Impl"


    // $ANTLR start "rule__OperationCS__Group__8"
    // InternalOCLinEcore.g:11009:1: rule__OperationCS__Group__8 : rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 ;
    public final void rule__OperationCS__Group__8() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11013:1: ( rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 )
            // InternalOCLinEcore.g:11014:2: rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9
            {
            pushFollow(FollowSets000.FOLLOW_56);
            rule__OperationCS__Group__8__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__9();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__8"


    // $ANTLR start "rule__OperationCS__Group__8__Impl"
    // InternalOCLinEcore.g:11021:1: rule__OperationCS__Group__8__Impl : ( ( rule__OperationCS__Group_8__0 )? ) ;
    public final void rule__OperationCS__Group__8__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11025:1: ( ( ( rule__OperationCS__Group_8__0 )? ) )
            // InternalOCLinEcore.g:11026:1: ( ( rule__OperationCS__Group_8__0 )? )
            {
            // InternalOCLinEcore.g:11026:1: ( ( rule__OperationCS__Group_8__0 )? )
            // InternalOCLinEcore.g:11027:1: ( rule__OperationCS__Group_8__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_8());
            }
            // InternalOCLinEcore.g:11028:1: ( rule__OperationCS__Group_8__0 )?
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( (LA131_0==47) ) {
                alt131=1;
            }
            switch (alt131) {
                case 1 :
                    // InternalOCLinEcore.g:11028:2: rule__OperationCS__Group_8__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_8__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_8());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__8__Impl"


    // $ANTLR start "rule__OperationCS__Group__9"
    // InternalOCLinEcore.g:11038:1: rule__OperationCS__Group__9 : rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 ;
    public final void rule__OperationCS__Group__9() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11042:1: ( rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 )
            // InternalOCLinEcore.g:11043:2: rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10
            {
            pushFollow(FollowSets000.FOLLOW_56);
            rule__OperationCS__Group__9__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__10();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__9"


    // $ANTLR start "rule__OperationCS__Group__9__Impl"
    // InternalOCLinEcore.g:11050:1: rule__OperationCS__Group__9__Impl : ( ( rule__OperationCS__Group_9__0 )? ) ;
    public final void rule__OperationCS__Group__9__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11054:1: ( ( ( rule__OperationCS__Group_9__0 )? ) )
            // InternalOCLinEcore.g:11055:1: ( ( rule__OperationCS__Group_9__0 )? )
            {
            // InternalOCLinEcore.g:11055:1: ( ( rule__OperationCS__Group_9__0 )? )
            // InternalOCLinEcore.g:11056:1: ( rule__OperationCS__Group_9__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9());
            }
            // InternalOCLinEcore.g:11057:1: ( rule__OperationCS__Group_9__0 )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==106) ) {
                int LA132_1 = input.LA(2);

                if ( (LA132_1==26||LA132_1==37||(LA132_1>=48 && LA132_1<=49)||LA132_1==128||LA132_1==130||(LA132_1>=132 && LA132_1<=133)) ) {
                    alt132=1;
                }
            }
            switch (alt132) {
                case 1 :
                    // InternalOCLinEcore.g:11057:2: rule__OperationCS__Group_9__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__Group_9__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_9());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__9__Impl"


    // $ANTLR start "rule__OperationCS__Group__10"
    // InternalOCLinEcore.g:11067:1: rule__OperationCS__Group__10 : rule__OperationCS__Group__10__Impl ;
    public final void rule__OperationCS__Group__10() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11071:1: ( rule__OperationCS__Group__10__Impl )
            // InternalOCLinEcore.g:11072:2: rule__OperationCS__Group__10__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group__10__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__10"


    // $ANTLR start "rule__OperationCS__Group__10__Impl"
    // InternalOCLinEcore.g:11078:1: rule__OperationCS__Group__10__Impl : ( ( rule__OperationCS__Alternatives_10 ) ) ;
    public final void rule__OperationCS__Group__10__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11082:1: ( ( ( rule__OperationCS__Alternatives_10 ) ) )
            // InternalOCLinEcore.g:11083:1: ( ( rule__OperationCS__Alternatives_10 ) )
            {
            // InternalOCLinEcore.g:11083:1: ( ( rule__OperationCS__Alternatives_10 ) )
            // InternalOCLinEcore.g:11084:1: ( rule__OperationCS__Alternatives_10 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_10());
            }
            // InternalOCLinEcore.g:11085:1: ( rule__OperationCS__Alternatives_10 )
            // InternalOCLinEcore.g:11085:2: rule__OperationCS__Alternatives_10
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Alternatives_10();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getAlternatives_10());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group__10__Impl"


    // $ANTLR start "rule__OperationCS__Group_0_0__0"
    // InternalOCLinEcore.g:11117:1: rule__OperationCS__Group_0_0__0 : rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 ;
    public final void rule__OperationCS__Group_0_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11121:1: ( rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 )
            // InternalOCLinEcore.g:11122:2: rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1
            {
            pushFollow(FollowSets000.FOLLOW_26);
            rule__OperationCS__Group_0_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_0_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_0__0"


    // $ANTLR start "rule__OperationCS__Group_0_0__0__Impl"
    // InternalOCLinEcore.g:11129:1: rule__OperationCS__Group_0_0__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) ;
    public final void rule__OperationCS__Group_0_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11133:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:11134:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:11134:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:11135:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:11136:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:11136:2: rule__OperationCS__QualifiersAssignment_0_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__QualifiersAssignment_0_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_0__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_0_0__1"
    // InternalOCLinEcore.g:11146:1: rule__OperationCS__Group_0_0__1 : rule__OperationCS__Group_0_0__1__Impl ;
    public final void rule__OperationCS__Group_0_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11150:1: ( rule__OperationCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:11151:2: rule__OperationCS__Group_0_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_0_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_0__1"


    // $ANTLR start "rule__OperationCS__Group_0_0__1__Impl"
    // InternalOCLinEcore.g:11157:1: rule__OperationCS__Group_0_0__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) ;
    public final void rule__OperationCS__Group_0_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11161:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:11162:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:11162:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:11163:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:11164:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
            int alt133=2;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==24) ) {
                alt133=1;
            }
            switch (alt133) {
                case 1 :
                    // InternalOCLinEcore.g:11164:2: rule__OperationCS__QualifiersAssignment_0_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_0_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_0__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_0_1__0"
    // InternalOCLinEcore.g:11178:1: rule__OperationCS__Group_0_1__0 : rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 ;
    public final void rule__OperationCS__Group_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11182:1: ( rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 )
            // InternalOCLinEcore.g:11183:2: rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_27);
            rule__OperationCS__Group_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_0_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_1__0"


    // $ANTLR start "rule__OperationCS__Group_0_1__0__Impl"
    // InternalOCLinEcore.g:11190:1: rule__OperationCS__Group_0_1__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) ;
    public final void rule__OperationCS__Group_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11194:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:11195:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:11195:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:11196:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:11197:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:11197:2: rule__OperationCS__QualifiersAssignment_0_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__QualifiersAssignment_0_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_1__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_0_1__1"
    // InternalOCLinEcore.g:11207:1: rule__OperationCS__Group_0_1__1 : rule__OperationCS__Group_0_1__1__Impl ;
    public final void rule__OperationCS__Group_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11211:1: ( rule__OperationCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:11212:2: rule__OperationCS__Group_0_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_0_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_1__1"


    // $ANTLR start "rule__OperationCS__Group_0_1__1__Impl"
    // InternalOCLinEcore.g:11218:1: rule__OperationCS__Group_0_1__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) ;
    public final void rule__OperationCS__Group_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11222:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:11223:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:11223:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:11224:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:11225:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==46) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // InternalOCLinEcore.g:11225:2: rule__OperationCS__QualifiersAssignment_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__QualifiersAssignment_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_0_1__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_5__0"
    // InternalOCLinEcore.g:11239:1: rule__OperationCS__Group_5__0 : rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 ;
    public final void rule__OperationCS__Group_5__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11243:1: ( rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 )
            // InternalOCLinEcore.g:11244:2: rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__OperationCS__Group_5__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_5__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5__0"


    // $ANTLR start "rule__OperationCS__Group_5__0__Impl"
    // InternalOCLinEcore.g:11251:1: rule__OperationCS__Group_5__0__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) ;
    public final void rule__OperationCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11255:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) )
            // InternalOCLinEcore.g:11256:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
            {
            // InternalOCLinEcore.g:11256:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
            // InternalOCLinEcore.g:11257:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_0());
            }
            // InternalOCLinEcore.g:11258:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
            // InternalOCLinEcore.g:11258:2: rule__OperationCS__OwnedParametersAssignment_5_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__OwnedParametersAssignment_5_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_5__1"
    // InternalOCLinEcore.g:11268:1: rule__OperationCS__Group_5__1 : rule__OperationCS__Group_5__1__Impl ;
    public final void rule__OperationCS__Group_5__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11272:1: ( rule__OperationCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:11273:2: rule__OperationCS__Group_5__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_5__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5__1"


    // $ANTLR start "rule__OperationCS__Group_5__1__Impl"
    // InternalOCLinEcore.g:11279:1: rule__OperationCS__Group_5__1__Impl : ( ( rule__OperationCS__Group_5_1__0 )* ) ;
    public final void rule__OperationCS__Group_5__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11283:1: ( ( ( rule__OperationCS__Group_5_1__0 )* ) )
            // InternalOCLinEcore.g:11284:1: ( ( rule__OperationCS__Group_5_1__0 )* )
            {
            // InternalOCLinEcore.g:11284:1: ( ( rule__OperationCS__Group_5_1__0 )* )
            // InternalOCLinEcore.g:11285:1: ( rule__OperationCS__Group_5_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:11286:1: ( rule__OperationCS__Group_5_1__0 )*
            loop135:
            do {
                int alt135=2;
                int LA135_0 = input.LA(1);

                if ( (LA135_0==105) ) {
                    alt135=1;
                }


                switch (alt135) {
            	case 1 :
            	    // InternalOCLinEcore.g:11286:2: rule__OperationCS__Group_5_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__OperationCS__Group_5_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_5_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_5_1__0"
    // InternalOCLinEcore.g:11300:1: rule__OperationCS__Group_5_1__0 : rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 ;
    public final void rule__OperationCS__Group_5_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11304:1: ( rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 )
            // InternalOCLinEcore.g:11305:2: rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__OperationCS__Group_5_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_5_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5_1__0"


    // $ANTLR start "rule__OperationCS__Group_5_1__0__Impl"
    // InternalOCLinEcore.g:11312:1: rule__OperationCS__Group_5_1__0__Impl : ( ',' ) ;
    public final void rule__OperationCS__Group_5_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11316:1: ( ( ',' ) )
            // InternalOCLinEcore.g:11317:1: ( ',' )
            {
            // InternalOCLinEcore.g:11317:1: ( ',' )
            // InternalOCLinEcore.g:11318:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5_1__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_5_1__1"
    // InternalOCLinEcore.g:11331:1: rule__OperationCS__Group_5_1__1 : rule__OperationCS__Group_5_1__1__Impl ;
    public final void rule__OperationCS__Group_5_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11335:1: ( rule__OperationCS__Group_5_1__1__Impl )
            // InternalOCLinEcore.g:11336:2: rule__OperationCS__Group_5_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_5_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5_1__1"


    // $ANTLR start "rule__OperationCS__Group_5_1__1__Impl"
    // InternalOCLinEcore.g:11342:1: rule__OperationCS__Group_5_1__1__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) ;
    public final void rule__OperationCS__Group_5_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11346:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) )
            // InternalOCLinEcore.g:11347:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
            {
            // InternalOCLinEcore.g:11347:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
            // InternalOCLinEcore.g:11348:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_1_1());
            }
            // InternalOCLinEcore.g:11349:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
            // InternalOCLinEcore.g:11349:2: rule__OperationCS__OwnedParametersAssignment_5_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__OwnedParametersAssignment_5_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_5_1__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_7__0"
    // InternalOCLinEcore.g:11363:1: rule__OperationCS__Group_7__0 : rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 ;
    public final void rule__OperationCS__Group_7__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11367:1: ( rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 )
            // InternalOCLinEcore.g:11368:2: rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__OperationCS__Group_7__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_7__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_7__0"


    // $ANTLR start "rule__OperationCS__Group_7__0__Impl"
    // InternalOCLinEcore.g:11375:1: rule__OperationCS__Group_7__0__Impl : ( ':' ) ;
    public final void rule__OperationCS__Group_7__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11379:1: ( ( ':' ) )
            // InternalOCLinEcore.g:11380:1: ( ':' )
            {
            // InternalOCLinEcore.g:11380:1: ( ':' )
            // InternalOCLinEcore.g:11381:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getColonKeyword_7_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getColonKeyword_7_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_7__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_7__1"
    // InternalOCLinEcore.g:11394:1: rule__OperationCS__Group_7__1 : rule__OperationCS__Group_7__1__Impl ;
    public final void rule__OperationCS__Group_7__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11398:1: ( rule__OperationCS__Group_7__1__Impl )
            // InternalOCLinEcore.g:11399:2: rule__OperationCS__Group_7__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_7__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_7__1"


    // $ANTLR start "rule__OperationCS__Group_7__1__Impl"
    // InternalOCLinEcore.g:11405:1: rule__OperationCS__Group_7__1__Impl : ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) ;
    public final void rule__OperationCS__Group_7__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11409:1: ( ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) )
            // InternalOCLinEcore.g:11410:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
            {
            // InternalOCLinEcore.g:11410:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
            // InternalOCLinEcore.g:11411:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedTypeAssignment_7_1());
            }
            // InternalOCLinEcore.g:11412:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
            // InternalOCLinEcore.g:11412:2: rule__OperationCS__OwnedTypeAssignment_7_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__OwnedTypeAssignment_7_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedTypeAssignment_7_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_7__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_8__0"
    // InternalOCLinEcore.g:11426:1: rule__OperationCS__Group_8__0 : rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 ;
    public final void rule__OperationCS__Group_8__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11430:1: ( rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 )
            // InternalOCLinEcore.g:11431:2: rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__OperationCS__Group_8__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_8__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__0"


    // $ANTLR start "rule__OperationCS__Group_8__0__Impl"
    // InternalOCLinEcore.g:11438:1: rule__OperationCS__Group_8__0__Impl : ( 'throws' ) ;
    public final void rule__OperationCS__Group_8__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11442:1: ( ( 'throws' ) )
            // InternalOCLinEcore.g:11443:1: ( 'throws' )
            {
            // InternalOCLinEcore.g:11443:1: ( 'throws' )
            // InternalOCLinEcore.g:11444:1: 'throws'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());
            }
            match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_8__1"
    // InternalOCLinEcore.g:11457:1: rule__OperationCS__Group_8__1 : rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 ;
    public final void rule__OperationCS__Group_8__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11461:1: ( rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 )
            // InternalOCLinEcore.g:11462:2: rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__OperationCS__Group_8__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_8__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__1"


    // $ANTLR start "rule__OperationCS__Group_8__1__Impl"
    // InternalOCLinEcore.g:11469:1: rule__OperationCS__Group_8__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) ;
    public final void rule__OperationCS__Group_8__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11473:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) )
            // InternalOCLinEcore.g:11474:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
            {
            // InternalOCLinEcore.g:11474:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
            // InternalOCLinEcore.g:11475:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_1());
            }
            // InternalOCLinEcore.g:11476:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
            // InternalOCLinEcore.g:11476:2: rule__OperationCS__OwnedExceptionsAssignment_8_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__OwnedExceptionsAssignment_8_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_8__2"
    // InternalOCLinEcore.g:11486:1: rule__OperationCS__Group_8__2 : rule__OperationCS__Group_8__2__Impl ;
    public final void rule__OperationCS__Group_8__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11490:1: ( rule__OperationCS__Group_8__2__Impl )
            // InternalOCLinEcore.g:11491:2: rule__OperationCS__Group_8__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_8__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__2"


    // $ANTLR start "rule__OperationCS__Group_8__2__Impl"
    // InternalOCLinEcore.g:11497:1: rule__OperationCS__Group_8__2__Impl : ( ( rule__OperationCS__Group_8_2__0 )* ) ;
    public final void rule__OperationCS__Group_8__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11501:1: ( ( ( rule__OperationCS__Group_8_2__0 )* ) )
            // InternalOCLinEcore.g:11502:1: ( ( rule__OperationCS__Group_8_2__0 )* )
            {
            // InternalOCLinEcore.g:11502:1: ( ( rule__OperationCS__Group_8_2__0 )* )
            // InternalOCLinEcore.g:11503:1: ( rule__OperationCS__Group_8_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_8_2());
            }
            // InternalOCLinEcore.g:11504:1: ( rule__OperationCS__Group_8_2__0 )*
            loop136:
            do {
                int alt136=2;
                int LA136_0 = input.LA(1);

                if ( (LA136_0==105) ) {
                    alt136=1;
                }


                switch (alt136) {
            	case 1 :
            	    // InternalOCLinEcore.g:11504:2: rule__OperationCS__Group_8_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__OperationCS__Group_8_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_8_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8__2__Impl"


    // $ANTLR start "rule__OperationCS__Group_8_2__0"
    // InternalOCLinEcore.g:11520:1: rule__OperationCS__Group_8_2__0 : rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 ;
    public final void rule__OperationCS__Group_8_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11524:1: ( rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 )
            // InternalOCLinEcore.g:11525:2: rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__OperationCS__Group_8_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_8_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8_2__0"


    // $ANTLR start "rule__OperationCS__Group_8_2__0__Impl"
    // InternalOCLinEcore.g:11532:1: rule__OperationCS__Group_8_2__0__Impl : ( ',' ) ;
    public final void rule__OperationCS__Group_8_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11536:1: ( ( ',' ) )
            // InternalOCLinEcore.g:11537:1: ( ',' )
            {
            // InternalOCLinEcore.g:11537:1: ( ',' )
            // InternalOCLinEcore.g:11538:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8_2__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_8_2__1"
    // InternalOCLinEcore.g:11551:1: rule__OperationCS__Group_8_2__1 : rule__OperationCS__Group_8_2__1__Impl ;
    public final void rule__OperationCS__Group_8_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11555:1: ( rule__OperationCS__Group_8_2__1__Impl )
            // InternalOCLinEcore.g:11556:2: rule__OperationCS__Group_8_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_8_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8_2__1"


    // $ANTLR start "rule__OperationCS__Group_8_2__1__Impl"
    // InternalOCLinEcore.g:11562:1: rule__OperationCS__Group_8_2__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) ;
    public final void rule__OperationCS__Group_8_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11566:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) )
            // InternalOCLinEcore.g:11567:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
            {
            // InternalOCLinEcore.g:11567:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
            // InternalOCLinEcore.g:11568:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_2_1());
            }
            // InternalOCLinEcore.g:11569:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
            // InternalOCLinEcore.g:11569:2: rule__OperationCS__OwnedExceptionsAssignment_8_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__OwnedExceptionsAssignment_8_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_8_2__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_9__0"
    // InternalOCLinEcore.g:11583:1: rule__OperationCS__Group_9__0 : rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 ;
    public final void rule__OperationCS__Group_9__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11587:1: ( rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 )
            // InternalOCLinEcore.g:11588:2: rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1
            {
            pushFollow(FollowSets000.FOLLOW_57);
            rule__OperationCS__Group_9__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_9__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__0"


    // $ANTLR start "rule__OperationCS__Group_9__0__Impl"
    // InternalOCLinEcore.g:11595:1: rule__OperationCS__Group_9__0__Impl : ( '{' ) ;
    public final void rule__OperationCS__Group_9__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11599:1: ( ( '{' ) )
            // InternalOCLinEcore.g:11600:1: ( '{' )
            {
            // InternalOCLinEcore.g:11600:1: ( '{' )
            // InternalOCLinEcore.g:11601:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_9__1"
    // InternalOCLinEcore.g:11614:1: rule__OperationCS__Group_9__1 : rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 ;
    public final void rule__OperationCS__Group_9__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11618:1: ( rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 )
            // InternalOCLinEcore.g:11619:2: rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__OperationCS__Group_9__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_9__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__1"


    // $ANTLR start "rule__OperationCS__Group_9__1__Impl"
    // InternalOCLinEcore.g:11626:1: rule__OperationCS__Group_9__1__Impl : ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) ;
    public final void rule__OperationCS__Group_9__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11630:1: ( ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) )
            // InternalOCLinEcore.g:11631:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
            {
            // InternalOCLinEcore.g:11631:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
            // InternalOCLinEcore.g:11632:1: ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* )
            {
            // InternalOCLinEcore.g:11632:1: ( ( rule__OperationCS__Group_9_1__0 ) )
            // InternalOCLinEcore.g:11633:1: ( rule__OperationCS__Group_9_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }
            // InternalOCLinEcore.g:11634:1: ( rule__OperationCS__Group_9_1__0 )
            // InternalOCLinEcore.g:11634:2: rule__OperationCS__Group_9_1__0
            {
            pushFollow(FollowSets000.FOLLOW_58);
            rule__OperationCS__Group_9_1__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }

            }

            // InternalOCLinEcore.g:11637:1: ( ( rule__OperationCS__Group_9_1__0 )* )
            // InternalOCLinEcore.g:11638:1: ( rule__OperationCS__Group_9_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }
            // InternalOCLinEcore.g:11639:1: ( rule__OperationCS__Group_9_1__0 )*
            loop137:
            do {
                int alt137=2;
                int LA137_0 = input.LA(1);

                if ( (LA137_0==26||LA137_0==37||(LA137_0>=48 && LA137_0<=49)||LA137_0==128||LA137_0==130||(LA137_0>=132 && LA137_0<=133)) ) {
                    alt137=1;
                }


                switch (alt137) {
            	case 1 :
            	    // InternalOCLinEcore.g:11639:2: rule__OperationCS__Group_9_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_58);
            	    rule__OperationCS__Group_9_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_9__2"
    // InternalOCLinEcore.g:11650:1: rule__OperationCS__Group_9__2 : rule__OperationCS__Group_9__2__Impl ;
    public final void rule__OperationCS__Group_9__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11654:1: ( rule__OperationCS__Group_9__2__Impl )
            // InternalOCLinEcore.g:11655:2: rule__OperationCS__Group_9__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_9__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__2"


    // $ANTLR start "rule__OperationCS__Group_9__2__Impl"
    // InternalOCLinEcore.g:11661:1: rule__OperationCS__Group_9__2__Impl : ( '}' ) ;
    public final void rule__OperationCS__Group_9__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11665:1: ( ( '}' ) )
            // InternalOCLinEcore.g:11666:1: ( '}' )
            {
            // InternalOCLinEcore.g:11666:1: ( '}' )
            // InternalOCLinEcore.g:11667:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9__2__Impl"


    // $ANTLR start "rule__OperationCS__Group_9_1__0"
    // InternalOCLinEcore.g:11686:1: rule__OperationCS__Group_9_1__0 : rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 ;
    public final void rule__OperationCS__Group_9_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11690:1: ( rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 )
            // InternalOCLinEcore.g:11691:2: rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__OperationCS__Group_9_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_9_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9_1__0"


    // $ANTLR start "rule__OperationCS__Group_9_1__0__Impl"
    // InternalOCLinEcore.g:11698:1: rule__OperationCS__Group_9_1__0__Impl : ( ( rule__OperationCS__Alternatives_9_1_0 ) ) ;
    public final void rule__OperationCS__Group_9_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11702:1: ( ( ( rule__OperationCS__Alternatives_9_1_0 ) ) )
            // InternalOCLinEcore.g:11703:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
            {
            // InternalOCLinEcore.g:11703:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
            // InternalOCLinEcore.g:11704:1: ( rule__OperationCS__Alternatives_9_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_9_1_0());
            }
            // InternalOCLinEcore.g:11705:1: ( rule__OperationCS__Alternatives_9_1_0 )
            // InternalOCLinEcore.g:11705:2: rule__OperationCS__Alternatives_9_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Alternatives_9_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getAlternatives_9_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9_1__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_9_1__1"
    // InternalOCLinEcore.g:11715:1: rule__OperationCS__Group_9_1__1 : rule__OperationCS__Group_9_1__1__Impl ;
    public final void rule__OperationCS__Group_9_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11719:1: ( rule__OperationCS__Group_9_1__1__Impl )
            // InternalOCLinEcore.g:11720:2: rule__OperationCS__Group_9_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_9_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9_1__1"


    // $ANTLR start "rule__OperationCS__Group_9_1__1__Impl"
    // InternalOCLinEcore.g:11726:1: rule__OperationCS__Group_9_1__1__Impl : ( ( ',' )? ) ;
    public final void rule__OperationCS__Group_9_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11730:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:11731:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:11731:1: ( ( ',' )? )
            // InternalOCLinEcore.g:11732:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());
            }
            // InternalOCLinEcore.g:11733:1: ( ',' )?
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==105) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // InternalOCLinEcore.g:11734:2: ','
                    {
                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_9_1__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0__0"
    // InternalOCLinEcore.g:11749:1: rule__OperationCS__Group_10_0__0 : rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 ;
    public final void rule__OperationCS__Group_10_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11753:1: ( rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 )
            // InternalOCLinEcore.g:11754:2: rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1
            {
            pushFollow(FollowSets000.FOLLOW_59);
            rule__OperationCS__Group_10_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__0"


    // $ANTLR start "rule__OperationCS__Group_10_0__0__Impl"
    // InternalOCLinEcore.g:11761:1: rule__OperationCS__Group_10_0__0__Impl : ( '{' ) ;
    public final void rule__OperationCS__Group_10_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11765:1: ( ( '{' ) )
            // InternalOCLinEcore.g:11766:1: ( '{' )
            {
            // InternalOCLinEcore.g:11766:1: ( '{' )
            // InternalOCLinEcore.g:11767:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0__1"
    // InternalOCLinEcore.g:11780:1: rule__OperationCS__Group_10_0__1 : rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 ;
    public final void rule__OperationCS__Group_10_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11784:1: ( rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 )
            // InternalOCLinEcore.g:11785:2: rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2
            {
            pushFollow(FollowSets000.FOLLOW_59);
            rule__OperationCS__Group_10_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__1"


    // $ANTLR start "rule__OperationCS__Group_10_0__1__Impl"
    // InternalOCLinEcore.g:11792:1: rule__OperationCS__Group_10_0__1__Impl : ( ( rule__OperationCS__Alternatives_10_0_1 )* ) ;
    public final void rule__OperationCS__Group_10_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11796:1: ( ( ( rule__OperationCS__Alternatives_10_0_1 )* ) )
            // InternalOCLinEcore.g:11797:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
            {
            // InternalOCLinEcore.g:11797:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
            // InternalOCLinEcore.g:11798:1: ( rule__OperationCS__Alternatives_10_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_10_0_1());
            }
            // InternalOCLinEcore.g:11799:1: ( rule__OperationCS__Alternatives_10_0_1 )*
            loop139:
            do {
                int alt139=2;
                int LA139_0 = input.LA(1);

                if ( (LA139_0==19||(LA139_0>=39 && LA139_0<=40)||(LA139_0>=54 && LA139_0<=55)||LA139_0==60) ) {
                    alt139=1;
                }


                switch (alt139) {
            	case 1 :
            	    // InternalOCLinEcore.g:11799:2: rule__OperationCS__Alternatives_10_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_60);
            	    rule__OperationCS__Alternatives_10_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getAlternatives_10_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0__2"
    // InternalOCLinEcore.g:11809:1: rule__OperationCS__Group_10_0__2 : rule__OperationCS__Group_10_0__2__Impl ;
    public final void rule__OperationCS__Group_10_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11813:1: ( rule__OperationCS__Group_10_0__2__Impl )
            // InternalOCLinEcore.g:11814:2: rule__OperationCS__Group_10_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__2"


    // $ANTLR start "rule__OperationCS__Group_10_0__2__Impl"
    // InternalOCLinEcore.g:11820:1: rule__OperationCS__Group_10_0__2__Impl : ( '}' ) ;
    public final void rule__OperationCS__Group_10_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11824:1: ( ( '}' ) )
            // InternalOCLinEcore.g:11825:1: ( '}' )
            {
            // InternalOCLinEcore.g:11825:1: ( '}' )
            // InternalOCLinEcore.g:11826:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0__2__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__0"
    // InternalOCLinEcore.g:11845:1: rule__OperationCS__Group_10_0_1_2__0 : rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 ;
    public final void rule__OperationCS__Group_10_0_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11849:1: ( rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 )
            // InternalOCLinEcore.g:11850:2: rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__OperationCS__Group_10_0_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__0"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__0__Impl"
    // InternalOCLinEcore.g:11857:1: rule__OperationCS__Group_10_0_1_2__0__Impl : ( 'body' ) ;
    public final void rule__OperationCS__Group_10_0_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11861:1: ( ( 'body' ) )
            // InternalOCLinEcore.g:11862:1: ( 'body' )
            {
            // InternalOCLinEcore.g:11862:1: ( 'body' )
            // InternalOCLinEcore.g:11863:1: 'body'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_2_0());
            }
            match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__0__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__1"
    // InternalOCLinEcore.g:11876:1: rule__OperationCS__Group_10_0_1_2__1 : rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 ;
    public final void rule__OperationCS__Group_10_0_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11880:1: ( rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 )
            // InternalOCLinEcore.g:11881:2: rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__OperationCS__Group_10_0_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0_1_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__1"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__1__Impl"
    // InternalOCLinEcore.g:11888:1: rule__OperationCS__Group_10_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
    public final void rule__OperationCS__Group_10_0_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11892:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:11893:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:11893:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:11894:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_2_1());
            }
            // InternalOCLinEcore.g:11895:1: ( ruleUnrestrictedName )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( ((LA140_0>=RULE_SIMPLE_ID && LA140_0<=RULE_ESCAPED_ID)||(LA140_0>=17 && LA140_0<=51)||(LA140_0>=54 && LA140_0<=60)) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalOCLinEcore.g:11895:3: ruleUnrestrictedName
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__1__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__2"
    // InternalOCLinEcore.g:11905:1: rule__OperationCS__Group_10_0_1_2__2 : rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 ;
    public final void rule__OperationCS__Group_10_0_1_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11909:1: ( rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 )
            // InternalOCLinEcore.g:11910:2: rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__OperationCS__Group_10_0_1_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0_1_2__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__2"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__2__Impl"
    // InternalOCLinEcore.g:11917:1: rule__OperationCS__Group_10_0_1_2__2__Impl : ( ':' ) ;
    public final void rule__OperationCS__Group_10_0_1_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11921:1: ( ( ':' ) )
            // InternalOCLinEcore.g:11922:1: ( ':' )
            {
            // InternalOCLinEcore.g:11922:1: ( ':' )
            // InternalOCLinEcore.g:11923:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__2__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__3"
    // InternalOCLinEcore.g:11936:1: rule__OperationCS__Group_10_0_1_2__3 : rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 ;
    public final void rule__OperationCS__Group_10_0_1_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11940:1: ( rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 )
            // InternalOCLinEcore.g:11941:2: rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__OperationCS__Group_10_0_1_2__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0_1_2__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__3"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__3__Impl"
    // InternalOCLinEcore.g:11948:1: rule__OperationCS__Group_10_0_1_2__3__Impl : ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) ;
    public final void rule__OperationCS__Group_10_0_1_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11952:1: ( ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:11953:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:11953:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
            // InternalOCLinEcore.g:11954:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsAssignment_10_0_1_2_3());
            }
            // InternalOCLinEcore.g:11955:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
            int alt141=2;
            int LA141_0 = input.LA(1);

            if ( ((LA141_0>=RULE_INT && LA141_0<=RULE_SINGLE_QUOTED_STRING)||(LA141_0>=RULE_SIMPLE_ID && LA141_0<=RULE_UNQUOTED_STRING)||(LA141_0>=17 && LA141_0<=51)||(LA141_0>=54 && LA141_0<=64)||(LA141_0>=85 && LA141_0<=99)||LA141_0==102||LA141_0==112||(LA141_0>=114 && LA141_0<=115)||LA141_0==120||(LA141_0>=125 && LA141_0<=126)||(LA141_0>=139 && LA141_0<=140)) ) {
                alt141=1;
            }
            switch (alt141) {
                case 1 :
                    // InternalOCLinEcore.g:11955:2: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsAssignment_10_0_1_2_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__3__Impl"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__4"
    // InternalOCLinEcore.g:11965:1: rule__OperationCS__Group_10_0_1_2__4 : rule__OperationCS__Group_10_0_1_2__4__Impl ;
    public final void rule__OperationCS__Group_10_0_1_2__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11969:1: ( rule__OperationCS__Group_10_0_1_2__4__Impl )
            // InternalOCLinEcore.g:11970:2: rule__OperationCS__Group_10_0_1_2__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__OperationCS__Group_10_0_1_2__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__4"


    // $ANTLR start "rule__OperationCS__Group_10_0_1_2__4__Impl"
    // InternalOCLinEcore.g:11976:1: rule__OperationCS__Group_10_0_1_2__4__Impl : ( ';' ) ;
    public final void rule__OperationCS__Group_10_0_1_2__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11980:1: ( ( ';' ) )
            // InternalOCLinEcore.g:11981:1: ( ';' )
            {
            // InternalOCLinEcore.g:11981:1: ( ';' )
            // InternalOCLinEcore.g:11982:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_2_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_2_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__Group_10_0_1_2__4__Impl"


    // $ANTLR start "rule__PackageCS__Group__0"
    // InternalOCLinEcore.g:12005:1: rule__PackageCS__Group__0 : rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 ;
    public final void rule__PackageCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12009:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
            // InternalOCLinEcore.g:12010:2: rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__PackageCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__0"


    // $ANTLR start "rule__PackageCS__Group__0__Impl"
    // InternalOCLinEcore.g:12017:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
    public final void rule__PackageCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12021:1: ( ( 'package' ) )
            // InternalOCLinEcore.g:12022:1: ( 'package' )
            {
            // InternalOCLinEcore.g:12022:1: ( 'package' )
            // InternalOCLinEcore.g:12023:1: 'package'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getPackageKeyword_0());
            }
            match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getPackageKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__0__Impl"


    // $ANTLR start "rule__PackageCS__Group__1"
    // InternalOCLinEcore.g:12036:1: rule__PackageCS__Group__1 : rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 ;
    public final void rule__PackageCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12040:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
            // InternalOCLinEcore.g:12041:2: rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__PackageCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__1"


    // $ANTLR start "rule__PackageCS__Group__1__Impl"
    // InternalOCLinEcore.g:12048:1: rule__PackageCS__Group__1__Impl : ( ( rule__PackageCS__NameAssignment_1 ) ) ;
    public final void rule__PackageCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12052:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
            // InternalOCLinEcore.g:12053:1: ( ( rule__PackageCS__NameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:12053:1: ( ( rule__PackageCS__NameAssignment_1 ) )
            // InternalOCLinEcore.g:12054:1: ( rule__PackageCS__NameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNameAssignment_1());
            }
            // InternalOCLinEcore.g:12055:1: ( rule__PackageCS__NameAssignment_1 )
            // InternalOCLinEcore.g:12055:2: rule__PackageCS__NameAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__NameAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNameAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__1__Impl"


    // $ANTLR start "rule__PackageCS__Group__2"
    // InternalOCLinEcore.g:12065:1: rule__PackageCS__Group__2 : rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 ;
    public final void rule__PackageCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12069:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
            // InternalOCLinEcore.g:12070:2: rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__PackageCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__2"


    // $ANTLR start "rule__PackageCS__Group__2__Impl"
    // InternalOCLinEcore.g:12077:1: rule__PackageCS__Group__2__Impl : ( ( rule__PackageCS__Group_2__0 )? ) ;
    public final void rule__PackageCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12081:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:12082:1: ( ( rule__PackageCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:12082:1: ( ( rule__PackageCS__Group_2__0 )? )
            // InternalOCLinEcore.g:12083:1: ( rule__PackageCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:12084:1: ( rule__PackageCS__Group_2__0 )?
            int alt142=2;
            int LA142_0 = input.LA(1);

            if ( (LA142_0==104) ) {
                alt142=1;
            }
            switch (alt142) {
                case 1 :
                    // InternalOCLinEcore.g:12084:2: rule__PackageCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__2__Impl"


    // $ANTLR start "rule__PackageCS__Group__3"
    // InternalOCLinEcore.g:12094:1: rule__PackageCS__Group__3 : rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 ;
    public final void rule__PackageCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12098:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
            // InternalOCLinEcore.g:12099:2: rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_25);
            rule__PackageCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__3"


    // $ANTLR start "rule__PackageCS__Group__3__Impl"
    // InternalOCLinEcore.g:12106:1: rule__PackageCS__Group__3__Impl : ( ( rule__PackageCS__Group_3__0 )? ) ;
    public final void rule__PackageCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12110:1: ( ( ( rule__PackageCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:12111:1: ( ( rule__PackageCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:12111:1: ( ( rule__PackageCS__Group_3__0 )? )
            // InternalOCLinEcore.g:12112:1: ( rule__PackageCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:12113:1: ( rule__PackageCS__Group_3__0 )?
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==71) ) {
                alt143=1;
            }
            switch (alt143) {
                case 1 :
                    // InternalOCLinEcore.g:12113:2: rule__PackageCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PackageCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__3__Impl"


    // $ANTLR start "rule__PackageCS__Group__4"
    // InternalOCLinEcore.g:12123:1: rule__PackageCS__Group__4 : rule__PackageCS__Group__4__Impl ;
    public final void rule__PackageCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12127:1: ( rule__PackageCS__Group__4__Impl )
            // InternalOCLinEcore.g:12128:2: rule__PackageCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__4"


    // $ANTLR start "rule__PackageCS__Group__4__Impl"
    // InternalOCLinEcore.g:12134:1: rule__PackageCS__Group__4__Impl : ( ( rule__PackageCS__Alternatives_4 ) ) ;
    public final void rule__PackageCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12138:1: ( ( ( rule__PackageCS__Alternatives_4 ) ) )
            // InternalOCLinEcore.g:12139:1: ( ( rule__PackageCS__Alternatives_4 ) )
            {
            // InternalOCLinEcore.g:12139:1: ( ( rule__PackageCS__Alternatives_4 ) )
            // InternalOCLinEcore.g:12140:1: ( rule__PackageCS__Alternatives_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getAlternatives_4());
            }
            // InternalOCLinEcore.g:12141:1: ( rule__PackageCS__Alternatives_4 )
            // InternalOCLinEcore.g:12141:2: rule__PackageCS__Alternatives_4
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Alternatives_4();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getAlternatives_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group__4__Impl"


    // $ANTLR start "rule__PackageCS__Group_2__0"
    // InternalOCLinEcore.g:12161:1: rule__PackageCS__Group_2__0 : rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 ;
    public final void rule__PackageCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12165:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
            // InternalOCLinEcore.g:12166:2: rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__PackageCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_2__0"


    // $ANTLR start "rule__PackageCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:12173:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__PackageCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12177:1: ( ( ':' ) )
            // InternalOCLinEcore.g:12178:1: ( ':' )
            {
            // InternalOCLinEcore.g:12178:1: ( ':' )
            // InternalOCLinEcore.g:12179:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getColonKeyword_2_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getColonKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_2__0__Impl"


    // $ANTLR start "rule__PackageCS__Group_2__1"
    // InternalOCLinEcore.g:12192:1: rule__PackageCS__Group_2__1 : rule__PackageCS__Group_2__1__Impl ;
    public final void rule__PackageCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12196:1: ( rule__PackageCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:12197:2: rule__PackageCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_2__1"


    // $ANTLR start "rule__PackageCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:12203:1: rule__PackageCS__Group_2__1__Impl : ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) ;
    public final void rule__PackageCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12207:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:12208:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:12208:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
            // InternalOCLinEcore.g:12209:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsPrefixAssignment_2_1());
            }
            // InternalOCLinEcore.g:12210:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
            // InternalOCLinEcore.g:12210:2: rule__PackageCS__NsPrefixAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__NsPrefixAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNsPrefixAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_2__1__Impl"


    // $ANTLR start "rule__PackageCS__Group_3__0"
    // InternalOCLinEcore.g:12224:1: rule__PackageCS__Group_3__0 : rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 ;
    public final void rule__PackageCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12228:1: ( rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 )
            // InternalOCLinEcore.g:12229:2: rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__PackageCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_3__0"


    // $ANTLR start "rule__PackageCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:12236:1: rule__PackageCS__Group_3__0__Impl : ( '=' ) ;
    public final void rule__PackageCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12240:1: ( ( '=' ) )
            // InternalOCLinEcore.g:12241:1: ( '=' )
            {
            // InternalOCLinEcore.g:12241:1: ( '=' )
            // InternalOCLinEcore.g:12242:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getEqualsSignKeyword_3_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getEqualsSignKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_3__0__Impl"


    // $ANTLR start "rule__PackageCS__Group_3__1"
    // InternalOCLinEcore.g:12255:1: rule__PackageCS__Group_3__1 : rule__PackageCS__Group_3__1__Impl ;
    public final void rule__PackageCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12259:1: ( rule__PackageCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:12260:2: rule__PackageCS__Group_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_3__1"


    // $ANTLR start "rule__PackageCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:12266:1: rule__PackageCS__Group_3__1__Impl : ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) ;
    public final void rule__PackageCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12270:1: ( ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:12271:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:12271:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
            // InternalOCLinEcore.g:12272:1: ( rule__PackageCS__NsURIAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsURIAssignment_3_1());
            }
            // InternalOCLinEcore.g:12273:1: ( rule__PackageCS__NsURIAssignment_3_1 )
            // InternalOCLinEcore.g:12273:2: rule__PackageCS__NsURIAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__NsURIAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNsURIAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_3__1__Impl"


    // $ANTLR start "rule__PackageCS__Group_4_0__0"
    // InternalOCLinEcore.g:12287:1: rule__PackageCS__Group_4_0__0 : rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 ;
    public final void rule__PackageCS__Group_4_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12291:1: ( rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 )
            // InternalOCLinEcore.g:12292:2: rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1
            {
            pushFollow(FollowSets000.FOLLOW_61);
            rule__PackageCS__Group_4_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_4_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__0"


    // $ANTLR start "rule__PackageCS__Group_4_0__0__Impl"
    // InternalOCLinEcore.g:12299:1: rule__PackageCS__Group_4_0__0__Impl : ( '{' ) ;
    public final void rule__PackageCS__Group_4_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12303:1: ( ( '{' ) )
            // InternalOCLinEcore.g:12304:1: ( '{' )
            {
            // InternalOCLinEcore.g:12304:1: ( '{' )
            // InternalOCLinEcore.g:12305:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__0__Impl"


    // $ANTLR start "rule__PackageCS__Group_4_0__1"
    // InternalOCLinEcore.g:12318:1: rule__PackageCS__Group_4_0__1 : rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 ;
    public final void rule__PackageCS__Group_4_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12322:1: ( rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 )
            // InternalOCLinEcore.g:12323:2: rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2
            {
            pushFollow(FollowSets000.FOLLOW_61);
            rule__PackageCS__Group_4_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_4_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__1"


    // $ANTLR start "rule__PackageCS__Group_4_0__1__Impl"
    // InternalOCLinEcore.g:12330:1: rule__PackageCS__Group_4_0__1__Impl : ( ( rule__PackageCS__Alternatives_4_0_1 )* ) ;
    public final void rule__PackageCS__Group_4_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12334:1: ( ( ( rule__PackageCS__Alternatives_4_0_1 )* ) )
            // InternalOCLinEcore.g:12335:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
            {
            // InternalOCLinEcore.g:12335:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
            // InternalOCLinEcore.g:12336:1: ( rule__PackageCS__Alternatives_4_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:12337:1: ( rule__PackageCS__Alternatives_4_0_1 )*
            loop144:
            do {
                int alt144=2;
                int LA144_0 = input.LA(1);

                if ( (LA144_0==17||LA144_0==21||LA144_0==23||LA144_0==27||LA144_0==38||LA144_0==41||(LA144_0>=54 && LA144_0<=55)||LA144_0==60) ) {
                    alt144=1;
                }


                switch (alt144) {
            	case 1 :
            	    // InternalOCLinEcore.g:12337:2: rule__PackageCS__Alternatives_4_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_62);
            	    rule__PackageCS__Alternatives_4_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getAlternatives_4_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__1__Impl"


    // $ANTLR start "rule__PackageCS__Group_4_0__2"
    // InternalOCLinEcore.g:12347:1: rule__PackageCS__Group_4_0__2 : rule__PackageCS__Group_4_0__2__Impl ;
    public final void rule__PackageCS__Group_4_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12351:1: ( rule__PackageCS__Group_4_0__2__Impl )
            // InternalOCLinEcore.g:12352:2: rule__PackageCS__Group_4_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PackageCS__Group_4_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__2"


    // $ANTLR start "rule__PackageCS__Group_4_0__2__Impl"
    // InternalOCLinEcore.g:12358:1: rule__PackageCS__Group_4_0__2__Impl : ( '}' ) ;
    public final void rule__PackageCS__Group_4_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12362:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12363:1: ( '}' )
            {
            // InternalOCLinEcore.g:12363:1: ( '}' )
            // InternalOCLinEcore.g:12364:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__Group_4_0__2__Impl"


    // $ANTLR start "rule__ParameterCS__Group__0"
    // InternalOCLinEcore.g:12383:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
    public final void rule__ParameterCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12387:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
            // InternalOCLinEcore.g:12388:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_63);
            rule__ParameterCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__0"


    // $ANTLR start "rule__ParameterCS__Group__0__Impl"
    // InternalOCLinEcore.g:12395:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__NameAssignment_0 ) ) ;
    public final void rule__ParameterCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12399:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:12400:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:12400:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:12401:1: ( rule__ParameterCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:12402:1: ( rule__ParameterCS__NameAssignment_0 )
            // InternalOCLinEcore.g:12402:2: rule__ParameterCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__0__Impl"


    // $ANTLR start "rule__ParameterCS__Group__1"
    // InternalOCLinEcore.g:12412:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 ;
    public final void rule__ParameterCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12416:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
            // InternalOCLinEcore.g:12417:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_63);
            rule__ParameterCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__1"


    // $ANTLR start "rule__ParameterCS__Group__1__Impl"
    // InternalOCLinEcore.g:12424:1: rule__ParameterCS__Group__1__Impl : ( ( rule__ParameterCS__Group_1__0 )? ) ;
    public final void rule__ParameterCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12428:1: ( ( ( rule__ParameterCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:12429:1: ( ( rule__ParameterCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:12429:1: ( ( rule__ParameterCS__Group_1__0 )? )
            // InternalOCLinEcore.g:12430:1: ( rule__ParameterCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:12431:1: ( rule__ParameterCS__Group_1__0 )?
            int alt145=2;
            int LA145_0 = input.LA(1);

            if ( (LA145_0==104) ) {
                alt145=1;
            }
            switch (alt145) {
                case 1 :
                    // InternalOCLinEcore.g:12431:2: rule__ParameterCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__1__Impl"


    // $ANTLR start "rule__ParameterCS__Group__2"
    // InternalOCLinEcore.g:12441:1: rule__ParameterCS__Group__2 : rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 ;
    public final void rule__ParameterCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12445:1: ( rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 )
            // InternalOCLinEcore.g:12446:2: rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_63);
            rule__ParameterCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__2"


    // $ANTLR start "rule__ParameterCS__Group__2__Impl"
    // InternalOCLinEcore.g:12453:1: rule__ParameterCS__Group__2__Impl : ( ( rule__ParameterCS__Group_2__0 )? ) ;
    public final void rule__ParameterCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12457:1: ( ( ( rule__ParameterCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:12458:1: ( ( rule__ParameterCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:12458:1: ( ( rule__ParameterCS__Group_2__0 )? )
            // InternalOCLinEcore.g:12459:1: ( rule__ParameterCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:12460:1: ( rule__ParameterCS__Group_2__0 )?
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==106) ) {
                int LA146_1 = input.LA(2);

                if ( (LA146_1==37||LA146_1==49||LA146_1==130||LA146_1==133) ) {
                    alt146=1;
                }
            }
            switch (alt146) {
                case 1 :
                    // InternalOCLinEcore.g:12460:2: rule__ParameterCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__2__Impl"


    // $ANTLR start "rule__ParameterCS__Group__3"
    // InternalOCLinEcore.g:12470:1: rule__ParameterCS__Group__3 : rule__ParameterCS__Group__3__Impl ;
    public final void rule__ParameterCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12474:1: ( rule__ParameterCS__Group__3__Impl )
            // InternalOCLinEcore.g:12475:2: rule__ParameterCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__3"


    // $ANTLR start "rule__ParameterCS__Group__3__Impl"
    // InternalOCLinEcore.g:12481:1: rule__ParameterCS__Group__3__Impl : ( ( rule__ParameterCS__Group_3__0 )? ) ;
    public final void rule__ParameterCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12485:1: ( ( ( rule__ParameterCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:12486:1: ( ( rule__ParameterCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:12486:1: ( ( rule__ParameterCS__Group_3__0 )? )
            // InternalOCLinEcore.g:12487:1: ( rule__ParameterCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:12488:1: ( rule__ParameterCS__Group_3__0 )?
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==106) ) {
                alt147=1;
            }
            switch (alt147) {
                case 1 :
                    // InternalOCLinEcore.g:12488:2: rule__ParameterCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ParameterCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group__3__Impl"


    // $ANTLR start "rule__ParameterCS__Group_1__0"
    // InternalOCLinEcore.g:12506:1: rule__ParameterCS__Group_1__0 : rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 ;
    public final void rule__ParameterCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12510:1: ( rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 )
            // InternalOCLinEcore.g:12511:2: rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__ParameterCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_1__0"


    // $ANTLR start "rule__ParameterCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:12518:1: rule__ParameterCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__ParameterCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12522:1: ( ( ':' ) )
            // InternalOCLinEcore.g:12523:1: ( ':' )
            {
            // InternalOCLinEcore.g:12523:1: ( ':' )
            // InternalOCLinEcore.g:12524:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getColonKeyword_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_1__0__Impl"


    // $ANTLR start "rule__ParameterCS__Group_1__1"
    // InternalOCLinEcore.g:12537:1: rule__ParameterCS__Group_1__1 : rule__ParameterCS__Group_1__1__Impl ;
    public final void rule__ParameterCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12541:1: ( rule__ParameterCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:12542:2: rule__ParameterCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_1__1"


    // $ANTLR start "rule__ParameterCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:12548:1: rule__ParameterCS__Group_1__1__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) ;
    public final void rule__ParameterCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12552:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:12553:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:12553:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:12554:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:12555:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:12555:2: rule__ParameterCS__OwnedTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__OwnedTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_1__1__Impl"


    // $ANTLR start "rule__ParameterCS__Group_2__0"
    // InternalOCLinEcore.g:12569:1: rule__ParameterCS__Group_2__0 : rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 ;
    public final void rule__ParameterCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12573:1: ( rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 )
            // InternalOCLinEcore.g:12574:2: rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_64);
            rule__ParameterCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__0"


    // $ANTLR start "rule__ParameterCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:12581:1: rule__ParameterCS__Group_2__0__Impl : ( '{' ) ;
    public final void rule__ParameterCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12585:1: ( ( '{' ) )
            // InternalOCLinEcore.g:12586:1: ( '{' )
            {
            // InternalOCLinEcore.g:12586:1: ( '{' )
            // InternalOCLinEcore.g:12587:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__0__Impl"


    // $ANTLR start "rule__ParameterCS__Group_2__1"
    // InternalOCLinEcore.g:12600:1: rule__ParameterCS__Group_2__1 : rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 ;
    public final void rule__ParameterCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12604:1: ( rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 )
            // InternalOCLinEcore.g:12605:2: rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__ParameterCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__1"


    // $ANTLR start "rule__ParameterCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:12612:1: rule__ParameterCS__Group_2__1__Impl : ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) ;
    public final void rule__ParameterCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12616:1: ( ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) )
            // InternalOCLinEcore.g:12617:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
            {
            // InternalOCLinEcore.g:12617:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:12618:1: ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:12618:1: ( ( rule__ParameterCS__Group_2_1__0 ) )
            // InternalOCLinEcore.g:12619:1: ( rule__ParameterCS__Group_2_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:12620:1: ( rule__ParameterCS__Group_2_1__0 )
            // InternalOCLinEcore.g:12620:2: rule__ParameterCS__Group_2_1__0
            {
            pushFollow(FollowSets000.FOLLOW_65);
            rule__ParameterCS__Group_2_1__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }

            }

            // InternalOCLinEcore.g:12623:1: ( ( rule__ParameterCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:12624:1: ( rule__ParameterCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:12625:1: ( rule__ParameterCS__Group_2_1__0 )*
            loop148:
            do {
                int alt148=2;
                int LA148_0 = input.LA(1);

                if ( (LA148_0==37||LA148_0==49||LA148_0==130||LA148_0==133) ) {
                    alt148=1;
                }


                switch (alt148) {
            	case 1 :
            	    // InternalOCLinEcore.g:12625:2: rule__ParameterCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_65);
            	    rule__ParameterCS__Group_2_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__1__Impl"


    // $ANTLR start "rule__ParameterCS__Group_2__2"
    // InternalOCLinEcore.g:12636:1: rule__ParameterCS__Group_2__2 : rule__ParameterCS__Group_2__2__Impl ;
    public final void rule__ParameterCS__Group_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12640:1: ( rule__ParameterCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:12641:2: rule__ParameterCS__Group_2__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__2"


    // $ANTLR start "rule__ParameterCS__Group_2__2__Impl"
    // InternalOCLinEcore.g:12647:1: rule__ParameterCS__Group_2__2__Impl : ( '}' ) ;
    public final void rule__ParameterCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12651:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12652:1: ( '}' )
            {
            // InternalOCLinEcore.g:12652:1: ( '}' )
            // InternalOCLinEcore.g:12653:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2__2__Impl"


    // $ANTLR start "rule__ParameterCS__Group_2_1__0"
    // InternalOCLinEcore.g:12672:1: rule__ParameterCS__Group_2_1__0 : rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 ;
    public final void rule__ParameterCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12676:1: ( rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 )
            // InternalOCLinEcore.g:12677:2: rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__ParameterCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2_1__0"


    // $ANTLR start "rule__ParameterCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:12684:1: rule__ParameterCS__Group_2_1__0__Impl : ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) ;
    public final void rule__ParameterCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12688:1: ( ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) )
            // InternalOCLinEcore.g:12689:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
            {
            // InternalOCLinEcore.g:12689:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
            // InternalOCLinEcore.g:12690:1: ( rule__ParameterCS__Alternatives_2_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getAlternatives_2_1_0());
            }
            // InternalOCLinEcore.g:12691:1: ( rule__ParameterCS__Alternatives_2_1_0 )
            // InternalOCLinEcore.g:12691:2: rule__ParameterCS__Alternatives_2_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Alternatives_2_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getAlternatives_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__ParameterCS__Group_2_1__1"
    // InternalOCLinEcore.g:12701:1: rule__ParameterCS__Group_2_1__1 : rule__ParameterCS__Group_2_1__1__Impl ;
    public final void rule__ParameterCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12705:1: ( rule__ParameterCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:12706:2: rule__ParameterCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2_1__1"


    // $ANTLR start "rule__ParameterCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:12712:1: rule__ParameterCS__Group_2_1__1__Impl : ( ( ',' )? ) ;
    public final void rule__ParameterCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12716:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:12717:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:12717:1: ( ( ',' )? )
            // InternalOCLinEcore.g:12718:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());
            }
            // InternalOCLinEcore.g:12719:1: ( ',' )?
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==105) ) {
                alt149=1;
            }
            switch (alt149) {
                case 1 :
                    // InternalOCLinEcore.g:12720:2: ','
                    {
                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__ParameterCS__Group_3__0"
    // InternalOCLinEcore.g:12735:1: rule__ParameterCS__Group_3__0 : rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 ;
    public final void rule__ParameterCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12739:1: ( rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 )
            // InternalOCLinEcore.g:12740:2: rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_48);
            rule__ParameterCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__0"


    // $ANTLR start "rule__ParameterCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:12747:1: rule__ParameterCS__Group_3__0__Impl : ( '{' ) ;
    public final void rule__ParameterCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12751:1: ( ( '{' ) )
            // InternalOCLinEcore.g:12752:1: ( '{' )
            {
            // InternalOCLinEcore.g:12752:1: ( '{' )
            // InternalOCLinEcore.g:12753:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__0__Impl"


    // $ANTLR start "rule__ParameterCS__Group_3__1"
    // InternalOCLinEcore.g:12766:1: rule__ParameterCS__Group_3__1 : rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 ;
    public final void rule__ParameterCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12770:1: ( rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 )
            // InternalOCLinEcore.g:12771:2: rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2
            {
            pushFollow(FollowSets000.FOLLOW_48);
            rule__ParameterCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_3__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__1"


    // $ANTLR start "rule__ParameterCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:12778:1: rule__ParameterCS__Group_3__1__Impl : ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) ;
    public final void rule__ParameterCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12782:1: ( ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) )
            // InternalOCLinEcore.g:12783:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
            {
            // InternalOCLinEcore.g:12783:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
            // InternalOCLinEcore.g:12784:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAssignment_3_1());
            }
            // InternalOCLinEcore.g:12785:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
            loop150:
            do {
                int alt150=2;
                int LA150_0 = input.LA(1);

                if ( ((LA150_0>=54 && LA150_0<=55)||LA150_0==60) ) {
                    alt150=1;
                }


                switch (alt150) {
            	case 1 :
            	    // InternalOCLinEcore.g:12785:2: rule__ParameterCS__OwnedAnnotationsAssignment_3_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_49);
            	    rule__ParameterCS__OwnedAnnotationsAssignment_3_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__1__Impl"


    // $ANTLR start "rule__ParameterCS__Group_3__2"
    // InternalOCLinEcore.g:12795:1: rule__ParameterCS__Group_3__2 : rule__ParameterCS__Group_3__2__Impl ;
    public final void rule__ParameterCS__Group_3__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12799:1: ( rule__ParameterCS__Group_3__2__Impl )
            // InternalOCLinEcore.g:12800:2: rule__ParameterCS__Group_3__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ParameterCS__Group_3__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__2"


    // $ANTLR start "rule__ParameterCS__Group_3__2__Impl"
    // InternalOCLinEcore.g:12806:1: rule__ParameterCS__Group_3__2__Impl : ( '}' ) ;
    public final void rule__ParameterCS__Group_3__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12810:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12811:1: ( '}' )
            {
            // InternalOCLinEcore.g:12811:1: ( '}' )
            // InternalOCLinEcore.g:12812:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__Group_3__2__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__0"
    // InternalOCLinEcore.g:12831:1: rule__ImplicitOppositeCS__Group__0 : rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 ;
    public final void rule__ImplicitOppositeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12835:1: ( rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 )
            // InternalOCLinEcore.g:12836:2: rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__ImplicitOppositeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__0"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__0__Impl"
    // InternalOCLinEcore.g:12843:1: rule__ImplicitOppositeCS__Group__0__Impl : ( 'opposite' ) ;
    public final void rule__ImplicitOppositeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12847:1: ( ( 'opposite' ) )
            // InternalOCLinEcore.g:12848:1: ( 'opposite' )
            {
            // InternalOCLinEcore.g:12848:1: ( 'opposite' )
            // InternalOCLinEcore.g:12849:1: 'opposite'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getOppositeKeyword_0());
            }
            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getOppositeKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__0__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__1"
    // InternalOCLinEcore.g:12862:1: rule__ImplicitOppositeCS__Group__1 : rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 ;
    public final void rule__ImplicitOppositeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12866:1: ( rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 )
            // InternalOCLinEcore.g:12867:2: rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__ImplicitOppositeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__1"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__1__Impl"
    // InternalOCLinEcore.g:12874:1: rule__ImplicitOppositeCS__Group__1__Impl : ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) ;
    public final void rule__ImplicitOppositeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12878:1: ( ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) )
            // InternalOCLinEcore.g:12879:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:12879:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
            // InternalOCLinEcore.g:12880:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getNameAssignment_1());
            }
            // InternalOCLinEcore.g:12881:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
            // InternalOCLinEcore.g:12881:2: rule__ImplicitOppositeCS__NameAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__NameAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getNameAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__1__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__2"
    // InternalOCLinEcore.g:12891:1: rule__ImplicitOppositeCS__Group__2 : rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 ;
    public final void rule__ImplicitOppositeCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12895:1: ( rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 )
            // InternalOCLinEcore.g:12896:2: rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__ImplicitOppositeCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__2"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__2__Impl"
    // InternalOCLinEcore.g:12903:1: rule__ImplicitOppositeCS__Group__2__Impl : ( ':' ) ;
    public final void rule__ImplicitOppositeCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12907:1: ( ( ':' ) )
            // InternalOCLinEcore.g:12908:1: ( ':' )
            {
            // InternalOCLinEcore.g:12908:1: ( ':' )
            // InternalOCLinEcore.g:12909:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getColonKeyword_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getColonKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__2__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__3"
    // InternalOCLinEcore.g:12922:1: rule__ImplicitOppositeCS__Group__3 : rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 ;
    public final void rule__ImplicitOppositeCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12926:1: ( rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 )
            // InternalOCLinEcore.g:12927:2: rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__ImplicitOppositeCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__3"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__3__Impl"
    // InternalOCLinEcore.g:12934:1: rule__ImplicitOppositeCS__Group__3__Impl : ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) ;
    public final void rule__ImplicitOppositeCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12938:1: ( ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) )
            // InternalOCLinEcore.g:12939:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
            {
            // InternalOCLinEcore.g:12939:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
            // InternalOCLinEcore.g:12940:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeAssignment_3());
            }
            // InternalOCLinEcore.g:12941:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
            // InternalOCLinEcore.g:12941:2: rule__ImplicitOppositeCS__OwnedTypeAssignment_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__OwnedTypeAssignment_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__3__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__4"
    // InternalOCLinEcore.g:12951:1: rule__ImplicitOppositeCS__Group__4 : rule__ImplicitOppositeCS__Group__4__Impl ;
    public final void rule__ImplicitOppositeCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12955:1: ( rule__ImplicitOppositeCS__Group__4__Impl )
            // InternalOCLinEcore.g:12956:2: rule__ImplicitOppositeCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__4"


    // $ANTLR start "rule__ImplicitOppositeCS__Group__4__Impl"
    // InternalOCLinEcore.g:12962:1: rule__ImplicitOppositeCS__Group__4__Impl : ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) ;
    public final void rule__ImplicitOppositeCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12966:1: ( ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:12967:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:12967:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
            // InternalOCLinEcore.g:12968:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:12969:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==106) ) {
                alt151=1;
            }
            switch (alt151) {
                case 1 :
                    // InternalOCLinEcore.g:12969:2: rule__ImplicitOppositeCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ImplicitOppositeCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group__4__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__0"
    // InternalOCLinEcore.g:12989:1: rule__ImplicitOppositeCS__Group_4__0 : rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 ;
    public final void rule__ImplicitOppositeCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12993:1: ( rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 )
            // InternalOCLinEcore.g:12994:2: rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_64);
            rule__ImplicitOppositeCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__0"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:13001:1: rule__ImplicitOppositeCS__Group_4__0__Impl : ( '{' ) ;
    public final void rule__ImplicitOppositeCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13005:1: ( ( '{' ) )
            // InternalOCLinEcore.g:13006:1: ( '{' )
            {
            // InternalOCLinEcore.g:13006:1: ( '{' )
            // InternalOCLinEcore.g:13007:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getLeftCurlyBracketKeyword_4_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getLeftCurlyBracketKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__0__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__1"
    // InternalOCLinEcore.g:13020:1: rule__ImplicitOppositeCS__Group_4__1 : rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 ;
    public final void rule__ImplicitOppositeCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13024:1: ( rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 )
            // InternalOCLinEcore.g:13025:2: rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__ImplicitOppositeCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group_4__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__1"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:13032:1: rule__ImplicitOppositeCS__Group_4__1__Impl : ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) ;
    public final void rule__ImplicitOppositeCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13036:1: ( ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) )
            // InternalOCLinEcore.g:13037:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
            {
            // InternalOCLinEcore.g:13037:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
            // InternalOCLinEcore.g:13038:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
            {
            // InternalOCLinEcore.g:13038:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) )
            // InternalOCLinEcore.g:13039:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
            }
            // InternalOCLinEcore.g:13040:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
            // InternalOCLinEcore.g:13040:2: rule__ImplicitOppositeCS__Group_4_1__0
            {
            pushFollow(FollowSets000.FOLLOW_65);
            rule__ImplicitOppositeCS__Group_4_1__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
            }

            }

            // InternalOCLinEcore.g:13043:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
            // InternalOCLinEcore.g:13044:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
            }
            // InternalOCLinEcore.g:13045:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
            loop152:
            do {
                int alt152=2;
                int LA152_0 = input.LA(1);

                if ( (LA152_0==37||LA152_0==49||LA152_0==130||LA152_0==133) ) {
                    alt152=1;
                }


                switch (alt152) {
            	case 1 :
            	    // InternalOCLinEcore.g:13045:2: rule__ImplicitOppositeCS__Group_4_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_65);
            	    rule__ImplicitOppositeCS__Group_4_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__1__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__2"
    // InternalOCLinEcore.g:13056:1: rule__ImplicitOppositeCS__Group_4__2 : rule__ImplicitOppositeCS__Group_4__2__Impl ;
    public final void rule__ImplicitOppositeCS__Group_4__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13060:1: ( rule__ImplicitOppositeCS__Group_4__2__Impl )
            // InternalOCLinEcore.g:13061:2: rule__ImplicitOppositeCS__Group_4__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group_4__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__2"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4__2__Impl"
    // InternalOCLinEcore.g:13067:1: rule__ImplicitOppositeCS__Group_4__2__Impl : ( '}' ) ;
    public final void rule__ImplicitOppositeCS__Group_4__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13071:1: ( ( '}' ) )
            // InternalOCLinEcore.g:13072:1: ( '}' )
            {
            // InternalOCLinEcore.g:13072:1: ( '}' )
            // InternalOCLinEcore.g:13073:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getRightCurlyBracketKeyword_4_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getRightCurlyBracketKeyword_4_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4__2__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__0"
    // InternalOCLinEcore.g:13092:1: rule__ImplicitOppositeCS__Group_4_1__0 : rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 ;
    public final void rule__ImplicitOppositeCS__Group_4_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13096:1: ( rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 )
            // InternalOCLinEcore.g:13097:2: rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__ImplicitOppositeCS__Group_4_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group_4_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4_1__0"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__0__Impl"
    // InternalOCLinEcore.g:13104:1: rule__ImplicitOppositeCS__Group_4_1__0__Impl : ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) ;
    public final void rule__ImplicitOppositeCS__Group_4_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13108:1: ( ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) )
            // InternalOCLinEcore.g:13109:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
            {
            // InternalOCLinEcore.g:13109:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
            // InternalOCLinEcore.g:13110:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getAlternatives_4_1_0());
            }
            // InternalOCLinEcore.g:13111:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
            // InternalOCLinEcore.g:13111:2: rule__ImplicitOppositeCS__Alternatives_4_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Alternatives_4_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getAlternatives_4_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4_1__0__Impl"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__1"
    // InternalOCLinEcore.g:13121:1: rule__ImplicitOppositeCS__Group_4_1__1 : rule__ImplicitOppositeCS__Group_4_1__1__Impl ;
    public final void rule__ImplicitOppositeCS__Group_4_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13125:1: ( rule__ImplicitOppositeCS__Group_4_1__1__Impl )
            // InternalOCLinEcore.g:13126:2: rule__ImplicitOppositeCS__Group_4_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ImplicitOppositeCS__Group_4_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4_1__1"


    // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__1__Impl"
    // InternalOCLinEcore.g:13132:1: rule__ImplicitOppositeCS__Group_4_1__1__Impl : ( ( ',' )? ) ;
    public final void rule__ImplicitOppositeCS__Group_4_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13136:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:13137:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:13137:1: ( ( ',' )? )
            // InternalOCLinEcore.g:13138:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getCommaKeyword_4_1_1());
            }
            // InternalOCLinEcore.g:13139:1: ( ',' )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==105) ) {
                alt153=1;
            }
            switch (alt153) {
                case 1 :
                    // InternalOCLinEcore.g:13140:2: ','
                    {
                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getCommaKeyword_4_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__Group_4_1__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__0"
    // InternalOCLinEcore.g:13155:1: rule__ReferenceCS__Group__0 : rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 ;
    public final void rule__ReferenceCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13159:1: ( rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 )
            // InternalOCLinEcore.g:13160:2: rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_67);
            rule__ReferenceCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__0"


    // $ANTLR start "rule__ReferenceCS__Group__0__Impl"
    // InternalOCLinEcore.g:13167:1: rule__ReferenceCS__Group__0__Impl : ( ( rule__ReferenceCS__Alternatives_0 )? ) ;
    public final void rule__ReferenceCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13171:1: ( ( ( rule__ReferenceCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:13172:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:13172:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:13173:1: ( rule__ReferenceCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:13174:1: ( rule__ReferenceCS__Alternatives_0 )?
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==24||LA154_0==46) ) {
                alt154=1;
            }
            switch (alt154) {
                case 1 :
                    // InternalOCLinEcore.g:13174:2: rule__ReferenceCS__Alternatives_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Alternatives_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__1"
    // InternalOCLinEcore.g:13184:1: rule__ReferenceCS__Group__1 : rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 ;
    public final void rule__ReferenceCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13188:1: ( rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 )
            // InternalOCLinEcore.g:13189:2: rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__ReferenceCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__1"


    // $ANTLR start "rule__ReferenceCS__Group__1__Impl"
    // InternalOCLinEcore.g:13196:1: rule__ReferenceCS__Group__1__Impl : ( 'property' ) ;
    public final void rule__ReferenceCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13200:1: ( ( 'property' ) )
            // InternalOCLinEcore.g:13201:1: ( 'property' )
            {
            // InternalOCLinEcore.g:13201:1: ( 'property' )
            // InternalOCLinEcore.g:13202:1: 'property'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());
            }
            match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__2"
    // InternalOCLinEcore.g:13215:1: rule__ReferenceCS__Group__2 : rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 ;
    public final void rule__ReferenceCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13219:1: ( rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 )
            // InternalOCLinEcore.g:13220:2: rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_68);
            rule__ReferenceCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__2"


    // $ANTLR start "rule__ReferenceCS__Group__2__Impl"
    // InternalOCLinEcore.g:13227:1: rule__ReferenceCS__Group__2__Impl : ( ( rule__ReferenceCS__NameAssignment_2 ) ) ;
    public final void rule__ReferenceCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13231:1: ( ( ( rule__ReferenceCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:13232:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:13232:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:13233:1: ( rule__ReferenceCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:13234:1: ( rule__ReferenceCS__NameAssignment_2 )
            // InternalOCLinEcore.g:13234:2: rule__ReferenceCS__NameAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__NameAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__3"
    // InternalOCLinEcore.g:13244:1: rule__ReferenceCS__Group__3 : rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 ;
    public final void rule__ReferenceCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13248:1: ( rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 )
            // InternalOCLinEcore.g:13249:2: rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_68);
            rule__ReferenceCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__3"


    // $ANTLR start "rule__ReferenceCS__Group__3__Impl"
    // InternalOCLinEcore.g:13256:1: rule__ReferenceCS__Group__3__Impl : ( ( rule__ReferenceCS__Group_3__0 )? ) ;
    public final void rule__ReferenceCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13260:1: ( ( ( rule__ReferenceCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:13261:1: ( ( rule__ReferenceCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:13261:1: ( ( rule__ReferenceCS__Group_3__0 )? )
            // InternalOCLinEcore.g:13262:1: ( rule__ReferenceCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:13263:1: ( rule__ReferenceCS__Group_3__0 )?
            int alt155=2;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==108) ) {
                alt155=1;
            }
            switch (alt155) {
                case 1 :
                    // InternalOCLinEcore.g:13263:2: rule__ReferenceCS__Group_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__3__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__4"
    // InternalOCLinEcore.g:13273:1: rule__ReferenceCS__Group__4 : rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 ;
    public final void rule__ReferenceCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13277:1: ( rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 )
            // InternalOCLinEcore.g:13278:2: rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_68);
            rule__ReferenceCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__4"


    // $ANTLR start "rule__ReferenceCS__Group__4__Impl"
    // InternalOCLinEcore.g:13285:1: rule__ReferenceCS__Group__4__Impl : ( ( rule__ReferenceCS__Group_4__0 )? ) ;
    public final void rule__ReferenceCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13289:1: ( ( ( rule__ReferenceCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:13290:1: ( ( rule__ReferenceCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:13290:1: ( ( rule__ReferenceCS__Group_4__0 )? )
            // InternalOCLinEcore.g:13291:1: ( rule__ReferenceCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:13292:1: ( rule__ReferenceCS__Group_4__0 )?
            int alt156=2;
            int LA156_0 = input.LA(1);

            if ( (LA156_0==104) ) {
                alt156=1;
            }
            switch (alt156) {
                case 1 :
                    // InternalOCLinEcore.g:13292:2: rule__ReferenceCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__4__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__5"
    // InternalOCLinEcore.g:13302:1: rule__ReferenceCS__Group__5 : rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 ;
    public final void rule__ReferenceCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13306:1: ( rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 )
            // InternalOCLinEcore.g:13307:2: rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_68);
            rule__ReferenceCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__5"


    // $ANTLR start "rule__ReferenceCS__Group__5__Impl"
    // InternalOCLinEcore.g:13314:1: rule__ReferenceCS__Group__5__Impl : ( ( rule__ReferenceCS__Group_5__0 )? ) ;
    public final void rule__ReferenceCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13318:1: ( ( ( rule__ReferenceCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:13319:1: ( ( rule__ReferenceCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:13319:1: ( ( rule__ReferenceCS__Group_5__0 )? )
            // InternalOCLinEcore.g:13320:1: ( rule__ReferenceCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:13321:1: ( rule__ReferenceCS__Group_5__0 )?
            int alt157=2;
            int LA157_0 = input.LA(1);

            if ( (LA157_0==71) ) {
                alt157=1;
            }
            switch (alt157) {
                case 1 :
                    // InternalOCLinEcore.g:13321:2: rule__ReferenceCS__Group_5__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__5__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__6"
    // InternalOCLinEcore.g:13331:1: rule__ReferenceCS__Group__6 : rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 ;
    public final void rule__ReferenceCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13335:1: ( rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 )
            // InternalOCLinEcore.g:13336:2: rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_68);
            rule__ReferenceCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__7();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__6"


    // $ANTLR start "rule__ReferenceCS__Group__6__Impl"
    // InternalOCLinEcore.g:13343:1: rule__ReferenceCS__Group__6__Impl : ( ( rule__ReferenceCS__Group_6__0 )? ) ;
    public final void rule__ReferenceCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13347:1: ( ( ( rule__ReferenceCS__Group_6__0 )? ) )
            // InternalOCLinEcore.g:13348:1: ( ( rule__ReferenceCS__Group_6__0 )? )
            {
            // InternalOCLinEcore.g:13348:1: ( ( rule__ReferenceCS__Group_6__0 )? )
            // InternalOCLinEcore.g:13349:1: ( rule__ReferenceCS__Group_6__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6());
            }
            // InternalOCLinEcore.g:13350:1: ( rule__ReferenceCS__Group_6__0 )?
            int alt158=2;
            int LA158_0 = input.LA(1);

            if ( (LA158_0==106) ) {
                int LA158_1 = input.LA(2);

                if ( (LA158_1==22||LA158_1==26||LA158_1==37||LA158_1==43||LA158_1==45||(LA158_1>=48 && LA158_1<=51)||LA158_1==128||(LA158_1>=130 && LA158_1<=135)||(LA158_1>=137 && LA158_1<=138)) ) {
                    alt158=1;
                }
            }
            switch (alt158) {
                case 1 :
                    // InternalOCLinEcore.g:13350:2: rule__ReferenceCS__Group_6__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__Group_6__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__6__Impl"


    // $ANTLR start "rule__ReferenceCS__Group__7"
    // InternalOCLinEcore.g:13360:1: rule__ReferenceCS__Group__7 : rule__ReferenceCS__Group__7__Impl ;
    public final void rule__ReferenceCS__Group__7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13364:1: ( rule__ReferenceCS__Group__7__Impl )
            // InternalOCLinEcore.g:13365:2: rule__ReferenceCS__Group__7__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group__7__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__7"


    // $ANTLR start "rule__ReferenceCS__Group__7__Impl"
    // InternalOCLinEcore.g:13371:1: rule__ReferenceCS__Group__7__Impl : ( ( rule__ReferenceCS__Alternatives_7 ) ) ;
    public final void rule__ReferenceCS__Group__7__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13375:1: ( ( ( rule__ReferenceCS__Alternatives_7 ) ) )
            // InternalOCLinEcore.g:13376:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
            {
            // InternalOCLinEcore.g:13376:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
            // InternalOCLinEcore.g:13377:1: ( rule__ReferenceCS__Alternatives_7 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_7());
            }
            // InternalOCLinEcore.g:13378:1: ( rule__ReferenceCS__Alternatives_7 )
            // InternalOCLinEcore.g:13378:2: rule__ReferenceCS__Alternatives_7
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Alternatives_7();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getAlternatives_7());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group__7__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_0_0__0"
    // InternalOCLinEcore.g:13404:1: rule__ReferenceCS__Group_0_0__0 : rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 ;
    public final void rule__ReferenceCS__Group_0_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13408:1: ( rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 )
            // InternalOCLinEcore.g:13409:2: rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1
            {
            pushFollow(FollowSets000.FOLLOW_26);
            rule__ReferenceCS__Group_0_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_0_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_0__0"


    // $ANTLR start "rule__ReferenceCS__Group_0_0__0__Impl"
    // InternalOCLinEcore.g:13416:1: rule__ReferenceCS__Group_0_0__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) ;
    public final void rule__ReferenceCS__Group_0_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13420:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:13421:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:13421:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:13422:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:13423:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:13423:2: rule__ReferenceCS__QualifiersAssignment_0_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__QualifiersAssignment_0_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_0__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_0_0__1"
    // InternalOCLinEcore.g:13433:1: rule__ReferenceCS__Group_0_0__1 : rule__ReferenceCS__Group_0_0__1__Impl ;
    public final void rule__ReferenceCS__Group_0_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13437:1: ( rule__ReferenceCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:13438:2: rule__ReferenceCS__Group_0_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_0_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_0__1"


    // $ANTLR start "rule__ReferenceCS__Group_0_0__1__Impl"
    // InternalOCLinEcore.g:13444:1: rule__ReferenceCS__Group_0_0__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) ;
    public final void rule__ReferenceCS__Group_0_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13448:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:13449:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:13449:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:13450:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:13451:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( (LA159_0==24) ) {
                alt159=1;
            }
            switch (alt159) {
                case 1 :
                    // InternalOCLinEcore.g:13451:2: rule__ReferenceCS__QualifiersAssignment_0_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_0_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_0__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_0_1__0"
    // InternalOCLinEcore.g:13465:1: rule__ReferenceCS__Group_0_1__0 : rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 ;
    public final void rule__ReferenceCS__Group_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13469:1: ( rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 )
            // InternalOCLinEcore.g:13470:2: rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_27);
            rule__ReferenceCS__Group_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_0_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_1__0"


    // $ANTLR start "rule__ReferenceCS__Group_0_1__0__Impl"
    // InternalOCLinEcore.g:13477:1: rule__ReferenceCS__Group_0_1__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) ;
    public final void rule__ReferenceCS__Group_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13481:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:13482:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:13482:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:13483:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:13484:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:13484:2: rule__ReferenceCS__QualifiersAssignment_0_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__QualifiersAssignment_0_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_1__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_0_1__1"
    // InternalOCLinEcore.g:13494:1: rule__ReferenceCS__Group_0_1__1 : rule__ReferenceCS__Group_0_1__1__Impl ;
    public final void rule__ReferenceCS__Group_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13498:1: ( rule__ReferenceCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:13499:2: rule__ReferenceCS__Group_0_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_0_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_1__1"


    // $ANTLR start "rule__ReferenceCS__Group_0_1__1__Impl"
    // InternalOCLinEcore.g:13505:1: rule__ReferenceCS__Group_0_1__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) ;
    public final void rule__ReferenceCS__Group_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13509:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:13510:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:13510:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:13511:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:13512:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==46) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // InternalOCLinEcore.g:13512:2: rule__ReferenceCS__QualifiersAssignment_0_1_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__QualifiersAssignment_0_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_0_1__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_3__0"
    // InternalOCLinEcore.g:13526:1: rule__ReferenceCS__Group_3__0 : rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 ;
    public final void rule__ReferenceCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13530:1: ( rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 )
            // InternalOCLinEcore.g:13531:2: rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__ReferenceCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_3__0"


    // $ANTLR start "rule__ReferenceCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:13538:1: rule__ReferenceCS__Group_3__0__Impl : ( '#' ) ;
    public final void rule__ReferenceCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13542:1: ( ( '#' ) )
            // InternalOCLinEcore.g:13543:1: ( '#' )
            {
            // InternalOCLinEcore.g:13543:1: ( '#' )
            // InternalOCLinEcore.g:13544:1: '#'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());
            }
            match(input,108,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_3__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_3__1"
    // InternalOCLinEcore.g:13557:1: rule__ReferenceCS__Group_3__1 : rule__ReferenceCS__Group_3__1__Impl ;
    public final void rule__ReferenceCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13561:1: ( rule__ReferenceCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:13562:2: rule__ReferenceCS__Group_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_3__1"


    // $ANTLR start "rule__ReferenceCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:13568:1: rule__ReferenceCS__Group_3__1__Impl : ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) ;
    public final void rule__ReferenceCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13572:1: ( ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:13573:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:13573:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
            // InternalOCLinEcore.g:13574:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredOppositeAssignment_3_1());
            }
            // InternalOCLinEcore.g:13575:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
            // InternalOCLinEcore.g:13575:2: rule__ReferenceCS__ReferredOppositeAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__ReferredOppositeAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredOppositeAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_3__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_4__0"
    // InternalOCLinEcore.g:13589:1: rule__ReferenceCS__Group_4__0 : rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 ;
    public final void rule__ReferenceCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13593:1: ( rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 )
            // InternalOCLinEcore.g:13594:2: rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__ReferenceCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_4__0"


    // $ANTLR start "rule__ReferenceCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:13601:1: rule__ReferenceCS__Group_4__0__Impl : ( ':' ) ;
    public final void rule__ReferenceCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13605:1: ( ( ':' ) )
            // InternalOCLinEcore.g:13606:1: ( ':' )
            {
            // InternalOCLinEcore.g:13606:1: ( ':' )
            // InternalOCLinEcore.g:13607:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_4__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_4__1"
    // InternalOCLinEcore.g:13620:1: rule__ReferenceCS__Group_4__1 : rule__ReferenceCS__Group_4__1__Impl ;
    public final void rule__ReferenceCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13624:1: ( rule__ReferenceCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:13625:2: rule__ReferenceCS__Group_4__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_4__1"


    // $ANTLR start "rule__ReferenceCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:13631:1: rule__ReferenceCS__Group_4__1__Impl : ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) ;
    public final void rule__ReferenceCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13635:1: ( ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:13636:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:13636:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
            // InternalOCLinEcore.g:13637:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedTypeAssignment_4_1());
            }
            // InternalOCLinEcore.g:13638:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
            // InternalOCLinEcore.g:13638:2: rule__ReferenceCS__OwnedTypeAssignment_4_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__OwnedTypeAssignment_4_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedTypeAssignment_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_4__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_5__0"
    // InternalOCLinEcore.g:13652:1: rule__ReferenceCS__Group_5__0 : rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 ;
    public final void rule__ReferenceCS__Group_5__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13656:1: ( rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 )
            // InternalOCLinEcore.g:13657:2: rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__ReferenceCS__Group_5__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_5__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_5__0"


    // $ANTLR start "rule__ReferenceCS__Group_5__0__Impl"
    // InternalOCLinEcore.g:13664:1: rule__ReferenceCS__Group_5__0__Impl : ( '=' ) ;
    public final void rule__ReferenceCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13668:1: ( ( '=' ) )
            // InternalOCLinEcore.g:13669:1: ( '=' )
            {
            // InternalOCLinEcore.g:13669:1: ( '=' )
            // InternalOCLinEcore.g:13670:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_5__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_5__1"
    // InternalOCLinEcore.g:13683:1: rule__ReferenceCS__Group_5__1 : rule__ReferenceCS__Group_5__1__Impl ;
    public final void rule__ReferenceCS__Group_5__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13687:1: ( rule__ReferenceCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:13688:2: rule__ReferenceCS__Group_5__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_5__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_5__1"


    // $ANTLR start "rule__ReferenceCS__Group_5__1__Impl"
    // InternalOCLinEcore.g:13694:1: rule__ReferenceCS__Group_5__1__Impl : ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) ;
    public final void rule__ReferenceCS__Group_5__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13698:1: ( ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) )
            // InternalOCLinEcore.g:13699:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
            {
            // InternalOCLinEcore.g:13699:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
            // InternalOCLinEcore.g:13700:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getDefaultAssignment_5_1());
            }
            // InternalOCLinEcore.g:13701:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
            // InternalOCLinEcore.g:13701:2: rule__ReferenceCS__DefaultAssignment_5_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__DefaultAssignment_5_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getDefaultAssignment_5_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_5__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_6__0"
    // InternalOCLinEcore.g:13715:1: rule__ReferenceCS__Group_6__0 : rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 ;
    public final void rule__ReferenceCS__Group_6__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13719:1: ( rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 )
            // InternalOCLinEcore.g:13720:2: rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1
            {
            pushFollow(FollowSets000.FOLLOW_69);
            rule__ReferenceCS__Group_6__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_6__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__0"


    // $ANTLR start "rule__ReferenceCS__Group_6__0__Impl"
    // InternalOCLinEcore.g:13727:1: rule__ReferenceCS__Group_6__0__Impl : ( '{' ) ;
    public final void rule__ReferenceCS__Group_6__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13731:1: ( ( '{' ) )
            // InternalOCLinEcore.g:13732:1: ( '{' )
            {
            // InternalOCLinEcore.g:13732:1: ( '{' )
            // InternalOCLinEcore.g:13733:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_6__1"
    // InternalOCLinEcore.g:13746:1: rule__ReferenceCS__Group_6__1 : rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 ;
    public final void rule__ReferenceCS__Group_6__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13750:1: ( rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 )
            // InternalOCLinEcore.g:13751:2: rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__ReferenceCS__Group_6__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_6__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__1"


    // $ANTLR start "rule__ReferenceCS__Group_6__1__Impl"
    // InternalOCLinEcore.g:13758:1: rule__ReferenceCS__Group_6__1__Impl : ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) ;
    public final void rule__ReferenceCS__Group_6__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13762:1: ( ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) )
            // InternalOCLinEcore.g:13763:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
            {
            // InternalOCLinEcore.g:13763:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
            // InternalOCLinEcore.g:13764:1: ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* )
            {
            // InternalOCLinEcore.g:13764:1: ( ( rule__ReferenceCS__Group_6_1__0 ) )
            // InternalOCLinEcore.g:13765:1: ( rule__ReferenceCS__Group_6_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }
            // InternalOCLinEcore.g:13766:1: ( rule__ReferenceCS__Group_6_1__0 )
            // InternalOCLinEcore.g:13766:2: rule__ReferenceCS__Group_6_1__0
            {
            pushFollow(FollowSets000.FOLLOW_70);
            rule__ReferenceCS__Group_6_1__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }

            }

            // InternalOCLinEcore.g:13769:1: ( ( rule__ReferenceCS__Group_6_1__0 )* )
            // InternalOCLinEcore.g:13770:1: ( rule__ReferenceCS__Group_6_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }
            // InternalOCLinEcore.g:13771:1: ( rule__ReferenceCS__Group_6_1__0 )*
            loop161:
            do {
                int alt161=2;
                int LA161_0 = input.LA(1);

                if ( (LA161_0==22||LA161_0==26||LA161_0==37||LA161_0==43||LA161_0==45||(LA161_0>=48 && LA161_0<=51)||LA161_0==128||(LA161_0>=130 && LA161_0<=135)||(LA161_0>=137 && LA161_0<=138)) ) {
                    alt161=1;
                }


                switch (alt161) {
            	case 1 :
            	    // InternalOCLinEcore.g:13771:2: rule__ReferenceCS__Group_6_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_70);
            	    rule__ReferenceCS__Group_6_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_6__2"
    // InternalOCLinEcore.g:13782:1: rule__ReferenceCS__Group_6__2 : rule__ReferenceCS__Group_6__2__Impl ;
    public final void rule__ReferenceCS__Group_6__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13786:1: ( rule__ReferenceCS__Group_6__2__Impl )
            // InternalOCLinEcore.g:13787:2: rule__ReferenceCS__Group_6__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_6__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__2"


    // $ANTLR start "rule__ReferenceCS__Group_6__2__Impl"
    // InternalOCLinEcore.g:13793:1: rule__ReferenceCS__Group_6__2__Impl : ( '}' ) ;
    public final void rule__ReferenceCS__Group_6__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13797:1: ( ( '}' ) )
            // InternalOCLinEcore.g:13798:1: ( '}' )
            {
            // InternalOCLinEcore.g:13798:1: ( '}' )
            // InternalOCLinEcore.g:13799:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_6_1__0"
    // InternalOCLinEcore.g:13818:1: rule__ReferenceCS__Group_6_1__0 : rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 ;
    public final void rule__ReferenceCS__Group_6_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13822:1: ( rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 )
            // InternalOCLinEcore.g:13823:2: rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__ReferenceCS__Group_6_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_6_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6_1__0"


    // $ANTLR start "rule__ReferenceCS__Group_6_1__0__Impl"
    // InternalOCLinEcore.g:13830:1: rule__ReferenceCS__Group_6_1__0__Impl : ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) ;
    public final void rule__ReferenceCS__Group_6_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13834:1: ( ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) )
            // InternalOCLinEcore.g:13835:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
            {
            // InternalOCLinEcore.g:13835:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
            // InternalOCLinEcore.g:13836:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_6_1_0());
            }
            // InternalOCLinEcore.g:13837:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
            // InternalOCLinEcore.g:13837:2: rule__ReferenceCS__Alternatives_6_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Alternatives_6_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getAlternatives_6_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6_1__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_6_1__1"
    // InternalOCLinEcore.g:13847:1: rule__ReferenceCS__Group_6_1__1 : rule__ReferenceCS__Group_6_1__1__Impl ;
    public final void rule__ReferenceCS__Group_6_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13851:1: ( rule__ReferenceCS__Group_6_1__1__Impl )
            // InternalOCLinEcore.g:13852:2: rule__ReferenceCS__Group_6_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_6_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6_1__1"


    // $ANTLR start "rule__ReferenceCS__Group_6_1__1__Impl"
    // InternalOCLinEcore.g:13858:1: rule__ReferenceCS__Group_6_1__1__Impl : ( ( ',' )? ) ;
    public final void rule__ReferenceCS__Group_6_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13862:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:13863:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:13863:1: ( ( ',' )? )
            // InternalOCLinEcore.g:13864:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());
            }
            // InternalOCLinEcore.g:13865:1: ( ',' )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==105) ) {
                alt162=1;
            }
            switch (alt162) {
                case 1 :
                    // InternalOCLinEcore.g:13866:2: ','
                    {
                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_6_1__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__0"
    // InternalOCLinEcore.g:13881:1: rule__ReferenceCS__Group_7_0__0 : rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 ;
    public final void rule__ReferenceCS__Group_7_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13885:1: ( rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 )
            // InternalOCLinEcore.g:13886:2: rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1
            {
            pushFollow(FollowSets000.FOLLOW_71);
            rule__ReferenceCS__Group_7_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__0__Impl"
    // InternalOCLinEcore.g:13893:1: rule__ReferenceCS__Group_7_0__0__Impl : ( '{' ) ;
    public final void rule__ReferenceCS__Group_7_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13897:1: ( ( '{' ) )
            // InternalOCLinEcore.g:13898:1: ( '{' )
            {
            // InternalOCLinEcore.g:13898:1: ( '{' )
            // InternalOCLinEcore.g:13899:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__1"
    // InternalOCLinEcore.g:13912:1: rule__ReferenceCS__Group_7_0__1 : rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 ;
    public final void rule__ReferenceCS__Group_7_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13916:1: ( rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 )
            // InternalOCLinEcore.g:13917:2: rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2
            {
            pushFollow(FollowSets000.FOLLOW_71);
            rule__ReferenceCS__Group_7_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__1__Impl"
    // InternalOCLinEcore.g:13924:1: rule__ReferenceCS__Group_7_0__1__Impl : ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) ;
    public final void rule__ReferenceCS__Group_7_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13928:1: ( ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) )
            // InternalOCLinEcore.g:13929:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
            {
            // InternalOCLinEcore.g:13929:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
            // InternalOCLinEcore.g:13930:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_7_0_1());
            }
            // InternalOCLinEcore.g:13931:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
            loop163:
            do {
                int alt163=2;
                int LA163_0 = input.LA(1);

                if ( (LA163_0==25||LA163_0==31||LA163_0==33||(LA163_0>=54 && LA163_0<=55)||LA163_0==58||LA163_0==60) ) {
                    alt163=1;
                }


                switch (alt163) {
            	case 1 :
            	    // InternalOCLinEcore.g:13931:2: rule__ReferenceCS__Alternatives_7_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_72);
            	    rule__ReferenceCS__Alternatives_7_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getAlternatives_7_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__2"
    // InternalOCLinEcore.g:13941:1: rule__ReferenceCS__Group_7_0__2 : rule__ReferenceCS__Group_7_0__2__Impl ;
    public final void rule__ReferenceCS__Group_7_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13945:1: ( rule__ReferenceCS__Group_7_0__2__Impl )
            // InternalOCLinEcore.g:13946:2: rule__ReferenceCS__Group_7_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__2"


    // $ANTLR start "rule__ReferenceCS__Group_7_0__2__Impl"
    // InternalOCLinEcore.g:13952:1: rule__ReferenceCS__Group_7_0__2__Impl : ( '}' ) ;
    public final void rule__ReferenceCS__Group_7_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13956:1: ( ( '}' ) )
            // InternalOCLinEcore.g:13957:1: ( '}' )
            {
            // InternalOCLinEcore.g:13957:1: ( '}' )
            // InternalOCLinEcore.g:13958:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__0"
    // InternalOCLinEcore.g:13977:1: rule__ReferenceCS__Group_7_0_1_1__0 : rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 ;
    public final void rule__ReferenceCS__Group_7_0_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13981:1: ( rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 )
            // InternalOCLinEcore.g:13982:2: rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__ReferenceCS__Group_7_0_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__0__Impl"
    // InternalOCLinEcore.g:13989:1: rule__ReferenceCS__Group_7_0_1_1__0__Impl : ( 'key' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13993:1: ( ( 'key' ) )
            // InternalOCLinEcore.g:13994:1: ( 'key' )
            {
            // InternalOCLinEcore.g:13994:1: ( 'key' )
            // InternalOCLinEcore.g:13995:1: 'key'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getKeyKeyword_7_0_1_1_0());
            }
            match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getKeyKeyword_7_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__1"
    // InternalOCLinEcore.g:14008:1: rule__ReferenceCS__Group_7_0_1_1__1 : rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 ;
    public final void rule__ReferenceCS__Group_7_0_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14012:1: ( rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 )
            // InternalOCLinEcore.g:14013:2: rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_73);
            rule__ReferenceCS__Group_7_0_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__1__Impl"
    // InternalOCLinEcore.g:14020:1: rule__ReferenceCS__Group_7_0_1_1__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14024:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) )
            // InternalOCLinEcore.g:14025:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
            {
            // InternalOCLinEcore.g:14025:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
            // InternalOCLinEcore.g:14026:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_1());
            }
            // InternalOCLinEcore.g:14027:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
            // InternalOCLinEcore.g:14027:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__2"
    // InternalOCLinEcore.g:14037:1: rule__ReferenceCS__Group_7_0_1_1__2 : rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 ;
    public final void rule__ReferenceCS__Group_7_0_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14041:1: ( rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 )
            // InternalOCLinEcore.g:14042:2: rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3
            {
            pushFollow(FollowSets000.FOLLOW_73);
            rule__ReferenceCS__Group_7_0_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__2"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__2__Impl"
    // InternalOCLinEcore.g:14049:1: rule__ReferenceCS__Group_7_0_1_1__2__Impl : ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14053:1: ( ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) )
            // InternalOCLinEcore.g:14054:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
            {
            // InternalOCLinEcore.g:14054:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
            // InternalOCLinEcore.g:14055:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1_2());
            }
            // InternalOCLinEcore.g:14056:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
            loop164:
            do {
                int alt164=2;
                int LA164_0 = input.LA(1);

                if ( (LA164_0==105) ) {
                    alt164=1;
                }


                switch (alt164) {
            	case 1 :
            	    // InternalOCLinEcore.g:14056:2: rule__ReferenceCS__Group_7_0_1_1_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__ReferenceCS__Group_7_0_1_1_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__3"
    // InternalOCLinEcore.g:14066:1: rule__ReferenceCS__Group_7_0_1_1__3 : rule__ReferenceCS__Group_7_0_1_1__3__Impl ;
    public final void rule__ReferenceCS__Group_7_0_1_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14070:1: ( rule__ReferenceCS__Group_7_0_1_1__3__Impl )
            // InternalOCLinEcore.g:14071:2: rule__ReferenceCS__Group_7_0_1_1__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__3"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__3__Impl"
    // InternalOCLinEcore.g:14077:1: rule__ReferenceCS__Group_7_0_1_1__3__Impl : ( ';' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14081:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14082:1: ( ';' )
            {
            // InternalOCLinEcore.g:14082:1: ( ';' )
            // InternalOCLinEcore.g:14083:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_3());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1__3__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__0"
    // InternalOCLinEcore.g:14104:1: rule__ReferenceCS__Group_7_0_1_1_2__0 : rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 ;
    public final void rule__ReferenceCS__Group_7_0_1_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14108:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 )
            // InternalOCLinEcore.g:14109:2: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__ReferenceCS__Group_7_0_1_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1_2__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__0__Impl"
    // InternalOCLinEcore.g:14116:1: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl : ( ',' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14120:1: ( ( ',' ) )
            // InternalOCLinEcore.g:14121:1: ( ',' )
            {
            // InternalOCLinEcore.g:14121:1: ( ',' )
            // InternalOCLinEcore.g:14122:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getCommaKeyword_7_0_1_1_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getCommaKeyword_7_0_1_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1_2__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__1"
    // InternalOCLinEcore.g:14135:1: rule__ReferenceCS__Group_7_0_1_1_2__1 : rule__ReferenceCS__Group_7_0_1_1_2__1__Impl ;
    public final void rule__ReferenceCS__Group_7_0_1_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14139:1: ( rule__ReferenceCS__Group_7_0_1_1_2__1__Impl )
            // InternalOCLinEcore.g:14140:2: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1_2__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__1__Impl"
    // InternalOCLinEcore.g:14146:1: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) ;
    public final void rule__ReferenceCS__Group_7_0_1_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14150:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) )
            // InternalOCLinEcore.g:14151:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
            {
            // InternalOCLinEcore.g:14151:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
            // InternalOCLinEcore.g:14152:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_2_1());
            }
            // InternalOCLinEcore.g:14153:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
            // InternalOCLinEcore.g:14153:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_1_2__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__0"
    // InternalOCLinEcore.g:14167:1: rule__ReferenceCS__Group_7_0_1_2__0 : rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 ;
    public final void rule__ReferenceCS__Group_7_0_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14171:1: ( rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 )
            // InternalOCLinEcore.g:14172:2: rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__ReferenceCS__Group_7_0_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__0__Impl"
    // InternalOCLinEcore.g:14179:1: rule__ReferenceCS__Group_7_0_1_2__0__Impl : ( 'initial' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14183:1: ( ( 'initial' ) )
            // InternalOCLinEcore.g:14184:1: ( 'initial' )
            {
            // InternalOCLinEcore.g:14184:1: ( 'initial' )
            // InternalOCLinEcore.g:14185:1: 'initial'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_2_0());
            }
            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__1"
    // InternalOCLinEcore.g:14198:1: rule__ReferenceCS__Group_7_0_1_2__1 : rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 ;
    public final void rule__ReferenceCS__Group_7_0_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14202:1: ( rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 )
            // InternalOCLinEcore.g:14203:2: rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__ReferenceCS__Group_7_0_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__1__Impl"
    // InternalOCLinEcore.g:14210:1: rule__ReferenceCS__Group_7_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
    public final void rule__ReferenceCS__Group_7_0_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14214:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:14215:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:14215:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:14216:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_2_1());
            }
            // InternalOCLinEcore.g:14217:1: ( ruleUnrestrictedName )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( ((LA165_0>=RULE_SIMPLE_ID && LA165_0<=RULE_ESCAPED_ID)||(LA165_0>=17 && LA165_0<=51)||(LA165_0>=54 && LA165_0<=60)) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // InternalOCLinEcore.g:14217:3: ruleUnrestrictedName
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__2"
    // InternalOCLinEcore.g:14227:1: rule__ReferenceCS__Group_7_0_1_2__2 : rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 ;
    public final void rule__ReferenceCS__Group_7_0_1_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14231:1: ( rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 )
            // InternalOCLinEcore.g:14232:2: rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__ReferenceCS__Group_7_0_1_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_2__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__2"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__2__Impl"
    // InternalOCLinEcore.g:14239:1: rule__ReferenceCS__Group_7_0_1_2__2__Impl : ( ':' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14243:1: ( ( ':' ) )
            // InternalOCLinEcore.g:14244:1: ( ':' )
            {
            // InternalOCLinEcore.g:14244:1: ( ':' )
            // InternalOCLinEcore.g:14245:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_2_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__3"
    // InternalOCLinEcore.g:14258:1: rule__ReferenceCS__Group_7_0_1_2__3 : rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 ;
    public final void rule__ReferenceCS__Group_7_0_1_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14262:1: ( rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 )
            // InternalOCLinEcore.g:14263:2: rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__ReferenceCS__Group_7_0_1_2__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_2__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__3"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__3__Impl"
    // InternalOCLinEcore.g:14270:1: rule__ReferenceCS__Group_7_0_1_2__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) ;
    public final void rule__ReferenceCS__Group_7_0_1_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14274:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:14275:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:14275:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
            // InternalOCLinEcore.g:14276:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_2_3());
            }
            // InternalOCLinEcore.g:14277:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( ((LA166_0>=RULE_INT && LA166_0<=RULE_SINGLE_QUOTED_STRING)||(LA166_0>=RULE_SIMPLE_ID && LA166_0<=RULE_UNQUOTED_STRING)||(LA166_0>=17 && LA166_0<=51)||(LA166_0>=54 && LA166_0<=64)||(LA166_0>=85 && LA166_0<=99)||LA166_0==102||LA166_0==112||(LA166_0>=114 && LA166_0<=115)||LA166_0==120||(LA166_0>=125 && LA166_0<=126)||(LA166_0>=139 && LA166_0<=140)) ) {
                alt166=1;
            }
            switch (alt166) {
                case 1 :
                    // InternalOCLinEcore.g:14277:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_2_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__3__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__4"
    // InternalOCLinEcore.g:14287:1: rule__ReferenceCS__Group_7_0_1_2__4 : rule__ReferenceCS__Group_7_0_1_2__4__Impl ;
    public final void rule__ReferenceCS__Group_7_0_1_2__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14291:1: ( rule__ReferenceCS__Group_7_0_1_2__4__Impl )
            // InternalOCLinEcore.g:14292:2: rule__ReferenceCS__Group_7_0_1_2__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_2__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__4"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__4__Impl"
    // InternalOCLinEcore.g:14298:1: rule__ReferenceCS__Group_7_0_1_2__4__Impl : ( ';' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_2__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14302:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14303:1: ( ';' )
            {
            // InternalOCLinEcore.g:14303:1: ( ';' )
            // InternalOCLinEcore.g:14304:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_2_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_2_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_2__4__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__0"
    // InternalOCLinEcore.g:14327:1: rule__ReferenceCS__Group_7_0_1_3__0 : rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 ;
    public final void rule__ReferenceCS__Group_7_0_1_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14331:1: ( rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 )
            // InternalOCLinEcore.g:14332:2: rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__ReferenceCS__Group_7_0_1_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__0__Impl"
    // InternalOCLinEcore.g:14339:1: rule__ReferenceCS__Group_7_0_1_3__0__Impl : ( 'derivation' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14343:1: ( ( 'derivation' ) )
            // InternalOCLinEcore.g:14344:1: ( 'derivation' )
            {
            // InternalOCLinEcore.g:14344:1: ( 'derivation' )
            // InternalOCLinEcore.g:14345:1: 'derivation'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_3_0());
            }
            match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__1"
    // InternalOCLinEcore.g:14358:1: rule__ReferenceCS__Group_7_0_1_3__1 : rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 ;
    public final void rule__ReferenceCS__Group_7_0_1_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14362:1: ( rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 )
            // InternalOCLinEcore.g:14363:2: rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2
            {
            pushFollow(FollowSets000.FOLLOW_15);
            rule__ReferenceCS__Group_7_0_1_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_3__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__1__Impl"
    // InternalOCLinEcore.g:14370:1: rule__ReferenceCS__Group_7_0_1_3__1__Impl : ( ( ruleUnrestrictedName )? ) ;
    public final void rule__ReferenceCS__Group_7_0_1_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14374:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:14375:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:14375:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:14376:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_3_1());
            }
            // InternalOCLinEcore.g:14377:1: ( ruleUnrestrictedName )?
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( ((LA167_0>=RULE_SIMPLE_ID && LA167_0<=RULE_ESCAPED_ID)||(LA167_0>=17 && LA167_0<=51)||(LA167_0>=54 && LA167_0<=60)) ) {
                alt167=1;
            }
            switch (alt167) {
                case 1 :
                    // InternalOCLinEcore.g:14377:3: ruleUnrestrictedName
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__1__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__2"
    // InternalOCLinEcore.g:14387:1: rule__ReferenceCS__Group_7_0_1_3__2 : rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 ;
    public final void rule__ReferenceCS__Group_7_0_1_3__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14391:1: ( rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 )
            // InternalOCLinEcore.g:14392:2: rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__ReferenceCS__Group_7_0_1_3__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_3__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__2"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__2__Impl"
    // InternalOCLinEcore.g:14399:1: rule__ReferenceCS__Group_7_0_1_3__2__Impl : ( ':' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_3__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14403:1: ( ( ':' ) )
            // InternalOCLinEcore.g:14404:1: ( ':' )
            {
            // InternalOCLinEcore.g:14404:1: ( ':' )
            // InternalOCLinEcore.g:14405:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_3_2());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_3_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__2__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__3"
    // InternalOCLinEcore.g:14418:1: rule__ReferenceCS__Group_7_0_1_3__3 : rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 ;
    public final void rule__ReferenceCS__Group_7_0_1_3__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14422:1: ( rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 )
            // InternalOCLinEcore.g:14423:2: rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4
            {
            pushFollow(FollowSets000.FOLLOW_14);
            rule__ReferenceCS__Group_7_0_1_3__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_3__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__3"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__3__Impl"
    // InternalOCLinEcore.g:14430:1: rule__ReferenceCS__Group_7_0_1_3__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) ;
    public final void rule__ReferenceCS__Group_7_0_1_3__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14434:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) )
            // InternalOCLinEcore.g:14435:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
            {
            // InternalOCLinEcore.g:14435:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
            // InternalOCLinEcore.g:14436:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_3_3());
            }
            // InternalOCLinEcore.g:14437:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( ((LA168_0>=RULE_INT && LA168_0<=RULE_SINGLE_QUOTED_STRING)||(LA168_0>=RULE_SIMPLE_ID && LA168_0<=RULE_UNQUOTED_STRING)||(LA168_0>=17 && LA168_0<=51)||(LA168_0>=54 && LA168_0<=64)||(LA168_0>=85 && LA168_0<=99)||LA168_0==102||LA168_0==112||(LA168_0>=114 && LA168_0<=115)||LA168_0==120||(LA168_0>=125 && LA168_0<=126)||(LA168_0>=139 && LA168_0<=140)) ) {
                alt168=1;
            }
            switch (alt168) {
                case 1 :
                    // InternalOCLinEcore.g:14437:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_3_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__3__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__4"
    // InternalOCLinEcore.g:14447:1: rule__ReferenceCS__Group_7_0_1_3__4 : rule__ReferenceCS__Group_7_0_1_3__4__Impl ;
    public final void rule__ReferenceCS__Group_7_0_1_3__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14451:1: ( rule__ReferenceCS__Group_7_0_1_3__4__Impl )
            // InternalOCLinEcore.g:14452:2: rule__ReferenceCS__Group_7_0_1_3__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_3__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__4"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__4__Impl"
    // InternalOCLinEcore.g:14458:1: rule__ReferenceCS__Group_7_0_1_3__4__Impl : ( ';' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_3__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14462:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14463:1: ( ';' )
            {
            // InternalOCLinEcore.g:14463:1: ( ';' )
            // InternalOCLinEcore.g:14464:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_3_4());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_3_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_3__4__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__0"
    // InternalOCLinEcore.g:14487:1: rule__ReferenceCS__Group_7_0_1_4__0 : rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 ;
    public final void rule__ReferenceCS__Group_7_0_1_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14491:1: ( rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 )
            // InternalOCLinEcore.g:14492:2: rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1
            {
            pushFollow(FollowSets000.FOLLOW_52);
            rule__ReferenceCS__Group_7_0_1_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_4__0"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__0__Impl"
    // InternalOCLinEcore.g:14499:1: rule__ReferenceCS__Group_7_0_1_4__0__Impl : ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) ;
    public final void rule__ReferenceCS__Group_7_0_1_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14503:1: ( ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) )
            // InternalOCLinEcore.g:14504:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
            {
            // InternalOCLinEcore.g:14504:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
            // InternalOCLinEcore.g:14505:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesAssignment_7_0_1_4_0());
            }
            // InternalOCLinEcore.g:14506:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
            // InternalOCLinEcore.g:14506:2: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesAssignment_7_0_1_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_4__0__Impl"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__1"
    // InternalOCLinEcore.g:14516:1: rule__ReferenceCS__Group_7_0_1_4__1 : rule__ReferenceCS__Group_7_0_1_4__1__Impl ;
    public final void rule__ReferenceCS__Group_7_0_1_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14520:1: ( rule__ReferenceCS__Group_7_0_1_4__1__Impl )
            // InternalOCLinEcore.g:14521:2: rule__ReferenceCS__Group_7_0_1_4__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ReferenceCS__Group_7_0_1_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_4__1"


    // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__1__Impl"
    // InternalOCLinEcore.g:14527:1: rule__ReferenceCS__Group_7_0_1_4__1__Impl : ( ';' ) ;
    public final void rule__ReferenceCS__Group_7_0_1_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14531:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14532:1: ( ';' )
            {
            // InternalOCLinEcore.g:14532:1: ( ';' )
            // InternalOCLinEcore.g:14533:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_4_1());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__Group_7_0_1_4__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__0"
    // InternalOCLinEcore.g:14550:1: rule__StructuredClassCS__Group__0 : rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 ;
    public final void rule__StructuredClassCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14554:1: ( rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 )
            // InternalOCLinEcore.g:14555:2: rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_74);
            rule__StructuredClassCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__0"


    // $ANTLR start "rule__StructuredClassCS__Group__0__Impl"
    // InternalOCLinEcore.g:14562:1: rule__StructuredClassCS__Group__0__Impl : ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) ;
    public final void rule__StructuredClassCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14566:1: ( ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) )
            // InternalOCLinEcore.g:14567:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
            {
            // InternalOCLinEcore.g:14567:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
            // InternalOCLinEcore.g:14568:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAssignment_0());
            }
            // InternalOCLinEcore.g:14569:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
            int alt169=2;
            int LA169_0 = input.LA(1);

            if ( (LA169_0==17) ) {
                alt169=1;
            }
            switch (alt169) {
                case 1 :
                    // InternalOCLinEcore.g:14569:2: rule__StructuredClassCS__IsAbstractAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__IsAbstractAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsAbstractAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__1"
    // InternalOCLinEcore.g:14579:1: rule__StructuredClassCS__Group__1 : rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 ;
    public final void rule__StructuredClassCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14583:1: ( rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 )
            // InternalOCLinEcore.g:14584:2: rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__StructuredClassCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__1"


    // $ANTLR start "rule__StructuredClassCS__Group__1__Impl"
    // InternalOCLinEcore.g:14591:1: rule__StructuredClassCS__Group__1__Impl : ( 'class' ) ;
    public final void rule__StructuredClassCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14595:1: ( ( 'class' ) )
            // InternalOCLinEcore.g:14596:1: ( 'class' )
            {
            // InternalOCLinEcore.g:14596:1: ( 'class' )
            // InternalOCLinEcore.g:14597:1: 'class'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());
            }
            match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__2"
    // InternalOCLinEcore.g:14610:1: rule__StructuredClassCS__Group__2 : rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 ;
    public final void rule__StructuredClassCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14614:1: ( rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 )
            // InternalOCLinEcore.g:14615:2: rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_75);
            rule__StructuredClassCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__2"


    // $ANTLR start "rule__StructuredClassCS__Group__2__Impl"
    // InternalOCLinEcore.g:14622:1: rule__StructuredClassCS__Group__2__Impl : ( ( rule__StructuredClassCS__NameAssignment_2 ) ) ;
    public final void rule__StructuredClassCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14626:1: ( ( ( rule__StructuredClassCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:14627:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:14627:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:14628:1: ( rule__StructuredClassCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:14629:1: ( rule__StructuredClassCS__NameAssignment_2 )
            // InternalOCLinEcore.g:14629:2: rule__StructuredClassCS__NameAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__NameAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getNameAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__2__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__3"
    // InternalOCLinEcore.g:14639:1: rule__StructuredClassCS__Group__3 : rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 ;
    public final void rule__StructuredClassCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14643:1: ( rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 )
            // InternalOCLinEcore.g:14644:2: rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_75);
            rule__StructuredClassCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__3"


    // $ANTLR start "rule__StructuredClassCS__Group__3__Impl"
    // InternalOCLinEcore.g:14651:1: rule__StructuredClassCS__Group__3__Impl : ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) ;
    public final void rule__StructuredClassCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14655:1: ( ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) )
            // InternalOCLinEcore.g:14656:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
            {
            // InternalOCLinEcore.g:14656:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
            // InternalOCLinEcore.g:14657:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureAssignment_3());
            }
            // InternalOCLinEcore.g:14658:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
            int alt170=2;
            int LA170_0 = input.LA(1);

            if ( (LA170_0==68||LA170_0==102) ) {
                alt170=1;
            }
            switch (alt170) {
                case 1 :
                    // InternalOCLinEcore.g:14658:2: rule__StructuredClassCS__OwnedSignatureAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__OwnedSignatureAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__3__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__4"
    // InternalOCLinEcore.g:14668:1: rule__StructuredClassCS__Group__4 : rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 ;
    public final void rule__StructuredClassCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14672:1: ( rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 )
            // InternalOCLinEcore.g:14673:2: rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_75);
            rule__StructuredClassCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__4"


    // $ANTLR start "rule__StructuredClassCS__Group__4__Impl"
    // InternalOCLinEcore.g:14680:1: rule__StructuredClassCS__Group__4__Impl : ( ( rule__StructuredClassCS__Group_4__0 )? ) ;
    public final void rule__StructuredClassCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14684:1: ( ( ( rule__StructuredClassCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:14685:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:14685:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
            // InternalOCLinEcore.g:14686:1: ( rule__StructuredClassCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:14687:1: ( rule__StructuredClassCS__Group_4__0 )?
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( (LA171_0==28) ) {
                alt171=1;
            }
            switch (alt171) {
                case 1 :
                    // InternalOCLinEcore.g:14687:2: rule__StructuredClassCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__4__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__5"
    // InternalOCLinEcore.g:14697:1: rule__StructuredClassCS__Group__5 : rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 ;
    public final void rule__StructuredClassCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14701:1: ( rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 )
            // InternalOCLinEcore.g:14702:2: rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_75);
            rule__StructuredClassCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__5"


    // $ANTLR start "rule__StructuredClassCS__Group__5__Impl"
    // InternalOCLinEcore.g:14709:1: rule__StructuredClassCS__Group__5__Impl : ( ( rule__StructuredClassCS__Group_5__0 )? ) ;
    public final void rule__StructuredClassCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14713:1: ( ( ( rule__StructuredClassCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:14714:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:14714:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
            // InternalOCLinEcore.g:14715:1: ( rule__StructuredClassCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:14716:1: ( rule__StructuredClassCS__Group_5__0 )?
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==104) ) {
                alt172=1;
            }
            switch (alt172) {
                case 1 :
                    // InternalOCLinEcore.g:14716:2: rule__StructuredClassCS__Group_5__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getGroup_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__5__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__6"
    // InternalOCLinEcore.g:14726:1: rule__StructuredClassCS__Group__6 : rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 ;
    public final void rule__StructuredClassCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14730:1: ( rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 )
            // InternalOCLinEcore.g:14731:2: rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_75);
            rule__StructuredClassCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__7();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__6"


    // $ANTLR start "rule__StructuredClassCS__Group__6__Impl"
    // InternalOCLinEcore.g:14738:1: rule__StructuredClassCS__Group__6__Impl : ( ( rule__StructuredClassCS__Group_6__0 )? ) ;
    public final void rule__StructuredClassCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14742:1: ( ( ( rule__StructuredClassCS__Group_6__0 )? ) )
            // InternalOCLinEcore.g:14743:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
            {
            // InternalOCLinEcore.g:14743:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
            // InternalOCLinEcore.g:14744:1: ( rule__StructuredClassCS__Group_6__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_6());
            }
            // InternalOCLinEcore.g:14745:1: ( rule__StructuredClassCS__Group_6__0 )?
            int alt173=2;
            int LA173_0 = input.LA(1);

            if ( (LA173_0==106) ) {
                int LA173_1 = input.LA(2);

                if ( (LA173_1==32) ) {
                    alt173=1;
                }
                else if ( (LA173_1==107) ) {
                    int LA173_4 = input.LA(3);

                    if ( (LA173_4==52||LA173_4==106) ) {
                        alt173=1;
                    }
                }
            }
            switch (alt173) {
                case 1 :
                    // InternalOCLinEcore.g:14745:2: rule__StructuredClassCS__Group_6__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__Group_6__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getGroup_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__6__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group__7"
    // InternalOCLinEcore.g:14755:1: rule__StructuredClassCS__Group__7 : rule__StructuredClassCS__Group__7__Impl ;
    public final void rule__StructuredClassCS__Group__7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14759:1: ( rule__StructuredClassCS__Group__7__Impl )
            // InternalOCLinEcore.g:14760:2: rule__StructuredClassCS__Group__7__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group__7__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__7"


    // $ANTLR start "rule__StructuredClassCS__Group__7__Impl"
    // InternalOCLinEcore.g:14766:1: rule__StructuredClassCS__Group__7__Impl : ( ( rule__StructuredClassCS__Alternatives_7 ) ) ;
    public final void rule__StructuredClassCS__Group__7__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14770:1: ( ( ( rule__StructuredClassCS__Alternatives_7 ) ) )
            // InternalOCLinEcore.g:14771:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
            {
            // InternalOCLinEcore.g:14771:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
            // InternalOCLinEcore.g:14772:1: ( rule__StructuredClassCS__Alternatives_7 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7());
            }
            // InternalOCLinEcore.g:14773:1: ( rule__StructuredClassCS__Alternatives_7 )
            // InternalOCLinEcore.g:14773:2: rule__StructuredClassCS__Alternatives_7
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Alternatives_7();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getAlternatives_7());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group__7__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_4__0"
    // InternalOCLinEcore.g:14799:1: rule__StructuredClassCS__Group_4__0 : rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 ;
    public final void rule__StructuredClassCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14803:1: ( rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 )
            // InternalOCLinEcore.g:14804:2: rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__StructuredClassCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__0"


    // $ANTLR start "rule__StructuredClassCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:14811:1: rule__StructuredClassCS__Group_4__0__Impl : ( 'extends' ) ;
    public final void rule__StructuredClassCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14815:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:14816:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:14816:1: ( 'extends' )
            // InternalOCLinEcore.g:14817:1: 'extends'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());
            }
            match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_4__1"
    // InternalOCLinEcore.g:14830:1: rule__StructuredClassCS__Group_4__1 : rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 ;
    public final void rule__StructuredClassCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14834:1: ( rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 )
            // InternalOCLinEcore.g:14835:2: rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__StructuredClassCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_4__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__1"


    // $ANTLR start "rule__StructuredClassCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:14842:1: rule__StructuredClassCS__Group_4__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) ;
    public final void rule__StructuredClassCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14846:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:14847:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:14847:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
            // InternalOCLinEcore.g:14848:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_1());
            }
            // InternalOCLinEcore.g:14849:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
            // InternalOCLinEcore.g:14849:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_4__2"
    // InternalOCLinEcore.g:14859:1: rule__StructuredClassCS__Group_4__2 : rule__StructuredClassCS__Group_4__2__Impl ;
    public final void rule__StructuredClassCS__Group_4__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14863:1: ( rule__StructuredClassCS__Group_4__2__Impl )
            // InternalOCLinEcore.g:14864:2: rule__StructuredClassCS__Group_4__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_4__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__2"


    // $ANTLR start "rule__StructuredClassCS__Group_4__2__Impl"
    // InternalOCLinEcore.g:14870:1: rule__StructuredClassCS__Group_4__2__Impl : ( ( rule__StructuredClassCS__Group_4_2__0 )* ) ;
    public final void rule__StructuredClassCS__Group_4__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14874:1: ( ( ( rule__StructuredClassCS__Group_4_2__0 )* ) )
            // InternalOCLinEcore.g:14875:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
            {
            // InternalOCLinEcore.g:14875:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
            // InternalOCLinEcore.g:14876:1: ( rule__StructuredClassCS__Group_4_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_4_2());
            }
            // InternalOCLinEcore.g:14877:1: ( rule__StructuredClassCS__Group_4_2__0 )*
            loop174:
            do {
                int alt174=2;
                int LA174_0 = input.LA(1);

                if ( (LA174_0==105) ) {
                    alt174=1;
                }


                switch (alt174) {
            	case 1 :
            	    // InternalOCLinEcore.g:14877:2: rule__StructuredClassCS__Group_4_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__StructuredClassCS__Group_4_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getGroup_4_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4__2__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_4_2__0"
    // InternalOCLinEcore.g:14893:1: rule__StructuredClassCS__Group_4_2__0 : rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 ;
    public final void rule__StructuredClassCS__Group_4_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14897:1: ( rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 )
            // InternalOCLinEcore.g:14898:2: rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__StructuredClassCS__Group_4_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_4_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4_2__0"


    // $ANTLR start "rule__StructuredClassCS__Group_4_2__0__Impl"
    // InternalOCLinEcore.g:14905:1: rule__StructuredClassCS__Group_4_2__0__Impl : ( ',' ) ;
    public final void rule__StructuredClassCS__Group_4_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14909:1: ( ( ',' ) )
            // InternalOCLinEcore.g:14910:1: ( ',' )
            {
            // InternalOCLinEcore.g:14910:1: ( ',' )
            // InternalOCLinEcore.g:14911:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4_2__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_4_2__1"
    // InternalOCLinEcore.g:14924:1: rule__StructuredClassCS__Group_4_2__1 : rule__StructuredClassCS__Group_4_2__1__Impl ;
    public final void rule__StructuredClassCS__Group_4_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14928:1: ( rule__StructuredClassCS__Group_4_2__1__Impl )
            // InternalOCLinEcore.g:14929:2: rule__StructuredClassCS__Group_4_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_4_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4_2__1"


    // $ANTLR start "rule__StructuredClassCS__Group_4_2__1__Impl"
    // InternalOCLinEcore.g:14935:1: rule__StructuredClassCS__Group_4_2__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) ;
    public final void rule__StructuredClassCS__Group_4_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14939:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) )
            // InternalOCLinEcore.g:14940:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
            {
            // InternalOCLinEcore.g:14940:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
            // InternalOCLinEcore.g:14941:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_2_1());
            }
            // InternalOCLinEcore.g:14942:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
            // InternalOCLinEcore.g:14942:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_4_2__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_5__0"
    // InternalOCLinEcore.g:14956:1: rule__StructuredClassCS__Group_5__0 : rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 ;
    public final void rule__StructuredClassCS__Group_5__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14960:1: ( rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 )
            // InternalOCLinEcore.g:14961:2: rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1
            {
            pushFollow(FollowSets000.FOLLOW_29);
            rule__StructuredClassCS__Group_5__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_5__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_5__0"


    // $ANTLR start "rule__StructuredClassCS__Group_5__0__Impl"
    // InternalOCLinEcore.g:14968:1: rule__StructuredClassCS__Group_5__0__Impl : ( ':' ) ;
    public final void rule__StructuredClassCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14972:1: ( ( ':' ) )
            // InternalOCLinEcore.g:14973:1: ( ':' )
            {
            // InternalOCLinEcore.g:14973:1: ( ':' )
            // InternalOCLinEcore.g:14974:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_5__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_5__1"
    // InternalOCLinEcore.g:14987:1: rule__StructuredClassCS__Group_5__1 : rule__StructuredClassCS__Group_5__1__Impl ;
    public final void rule__StructuredClassCS__Group_5__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14991:1: ( rule__StructuredClassCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:14992:2: rule__StructuredClassCS__Group_5__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_5__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_5__1"


    // $ANTLR start "rule__StructuredClassCS__Group_5__1__Impl"
    // InternalOCLinEcore.g:14998:1: rule__StructuredClassCS__Group_5__1__Impl : ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) ;
    public final void rule__StructuredClassCS__Group_5__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15002:1: ( ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) )
            // InternalOCLinEcore.g:15003:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
            {
            // InternalOCLinEcore.g:15003:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
            // InternalOCLinEcore.g:15004:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameAssignment_5_1());
            }
            // InternalOCLinEcore.g:15005:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
            // InternalOCLinEcore.g:15005:2: rule__StructuredClassCS__InstanceClassNameAssignment_5_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__InstanceClassNameAssignment_5_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameAssignment_5_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_5__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_6__0"
    // InternalOCLinEcore.g:15019:1: rule__StructuredClassCS__Group_6__0 : rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 ;
    public final void rule__StructuredClassCS__Group_6__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15023:1: ( rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 )
            // InternalOCLinEcore.g:15024:2: rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1
            {
            pushFollow(FollowSets000.FOLLOW_76);
            rule__StructuredClassCS__Group_6__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_6__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__0"


    // $ANTLR start "rule__StructuredClassCS__Group_6__0__Impl"
    // InternalOCLinEcore.g:15031:1: rule__StructuredClassCS__Group_6__0__Impl : ( '{' ) ;
    public final void rule__StructuredClassCS__Group_6__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15035:1: ( ( '{' ) )
            // InternalOCLinEcore.g:15036:1: ( '{' )
            {
            // InternalOCLinEcore.g:15036:1: ( '{' )
            // InternalOCLinEcore.g:15037:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_6__1"
    // InternalOCLinEcore.g:15050:1: rule__StructuredClassCS__Group_6__1 : rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 ;
    public final void rule__StructuredClassCS__Group_6__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15054:1: ( rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 )
            // InternalOCLinEcore.g:15055:2: rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2
            {
            pushFollow(FollowSets000.FOLLOW_76);
            rule__StructuredClassCS__Group_6__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_6__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__1"


    // $ANTLR start "rule__StructuredClassCS__Group_6__1__Impl"
    // InternalOCLinEcore.g:15062:1: rule__StructuredClassCS__Group_6__1__Impl : ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) ;
    public final void rule__StructuredClassCS__Group_6__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15066:1: ( ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) )
            // InternalOCLinEcore.g:15067:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
            {
            // InternalOCLinEcore.g:15067:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
            // InternalOCLinEcore.g:15068:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceAssignment_6_1());
            }
            // InternalOCLinEcore.g:15069:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==32) ) {
                alt175=1;
            }
            switch (alt175) {
                case 1 :
                    // InternalOCLinEcore.g:15069:2: rule__StructuredClassCS__IsInterfaceAssignment_6_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__StructuredClassCS__IsInterfaceAssignment_6_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsInterfaceAssignment_6_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_6__2"
    // InternalOCLinEcore.g:15079:1: rule__StructuredClassCS__Group_6__2 : rule__StructuredClassCS__Group_6__2__Impl ;
    public final void rule__StructuredClassCS__Group_6__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15083:1: ( rule__StructuredClassCS__Group_6__2__Impl )
            // InternalOCLinEcore.g:15084:2: rule__StructuredClassCS__Group_6__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_6__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__2"


    // $ANTLR start "rule__StructuredClassCS__Group_6__2__Impl"
    // InternalOCLinEcore.g:15090:1: rule__StructuredClassCS__Group_6__2__Impl : ( '}' ) ;
    public final void rule__StructuredClassCS__Group_6__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15094:1: ( ( '}' ) )
            // InternalOCLinEcore.g:15095:1: ( '}' )
            {
            // InternalOCLinEcore.g:15095:1: ( '}' )
            // InternalOCLinEcore.g:15096:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_6__2__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__0"
    // InternalOCLinEcore.g:15115:1: rule__StructuredClassCS__Group_7_0__0 : rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 ;
    public final void rule__StructuredClassCS__Group_7_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15119:1: ( rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 )
            // InternalOCLinEcore.g:15120:2: rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1
            {
            pushFollow(FollowSets000.FOLLOW_45);
            rule__StructuredClassCS__Group_7_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_7_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__0"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__0__Impl"
    // InternalOCLinEcore.g:15127:1: rule__StructuredClassCS__Group_7_0__0__Impl : ( '{' ) ;
    public final void rule__StructuredClassCS__Group_7_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15131:1: ( ( '{' ) )
            // InternalOCLinEcore.g:15132:1: ( '{' )
            {
            // InternalOCLinEcore.g:15132:1: ( '{' )
            // InternalOCLinEcore.g:15133:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__0__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__1"
    // InternalOCLinEcore.g:15146:1: rule__StructuredClassCS__Group_7_0__1 : rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 ;
    public final void rule__StructuredClassCS__Group_7_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15150:1: ( rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 )
            // InternalOCLinEcore.g:15151:2: rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2
            {
            pushFollow(FollowSets000.FOLLOW_45);
            rule__StructuredClassCS__Group_7_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_7_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__1"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__1__Impl"
    // InternalOCLinEcore.g:15158:1: rule__StructuredClassCS__Group_7_0__1__Impl : ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) ;
    public final void rule__StructuredClassCS__Group_7_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15162:1: ( ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) )
            // InternalOCLinEcore.g:15163:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
            {
            // InternalOCLinEcore.g:15163:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
            // InternalOCLinEcore.g:15164:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7_0_1());
            }
            // InternalOCLinEcore.g:15165:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
            loop176:
            do {
                int alt176=2;
                int LA176_0 = input.LA(1);

                if ( (LA176_0==18||LA176_0==20||LA176_0==24||LA176_0==36||LA176_0==42||LA176_0==46||(LA176_0>=54 && LA176_0<=56)||LA176_0==60) ) {
                    alt176=1;
                }


                switch (alt176) {
            	case 1 :
            	    // InternalOCLinEcore.g:15165:2: rule__StructuredClassCS__Alternatives_7_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_46);
            	    rule__StructuredClassCS__Alternatives_7_0_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getAlternatives_7_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__1__Impl"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__2"
    // InternalOCLinEcore.g:15175:1: rule__StructuredClassCS__Group_7_0__2 : rule__StructuredClassCS__Group_7_0__2__Impl ;
    public final void rule__StructuredClassCS__Group_7_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15179:1: ( rule__StructuredClassCS__Group_7_0__2__Impl )
            // InternalOCLinEcore.g:15180:2: rule__StructuredClassCS__Group_7_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__StructuredClassCS__Group_7_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__2"


    // $ANTLR start "rule__StructuredClassCS__Group_7_0__2__Impl"
    // InternalOCLinEcore.g:15186:1: rule__StructuredClassCS__Group_7_0__2__Impl : ( '}' ) ;
    public final void rule__StructuredClassCS__Group_7_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15190:1: ( ( '}' ) )
            // InternalOCLinEcore.g:15191:1: ( '}' )
            {
            // InternalOCLinEcore.g:15191:1: ( '}' )
            // InternalOCLinEcore.g:15192:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__Group_7_0__2__Impl"


    // $ANTLR start "rule__SysMLCS__Group__0"
    // InternalOCLinEcore.g:15211:1: rule__SysMLCS__Group__0 : rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 ;
    public final void rule__SysMLCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15215:1: ( rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 )
            // InternalOCLinEcore.g:15216:2: rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_77);
            rule__SysMLCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__0"


    // $ANTLR start "rule__SysMLCS__Group__0__Impl"
    // InternalOCLinEcore.g:15223:1: rule__SysMLCS__Group__0__Impl : ( () ) ;
    public final void rule__SysMLCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15227:1: ( ( () ) )
            // InternalOCLinEcore.g:15228:1: ( () )
            {
            // InternalOCLinEcore.g:15228:1: ( () )
            // InternalOCLinEcore.g:15229:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSysMLCSAction_0());
            }
            // InternalOCLinEcore.g:15230:1: ()
            // InternalOCLinEcore.g:15232:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getSysMLCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__0__Impl"


    // $ANTLR start "rule__SysMLCS__Group__1"
    // InternalOCLinEcore.g:15242:1: rule__SysMLCS__Group__1 : rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 ;
    public final void rule__SysMLCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15246:1: ( rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 )
            // InternalOCLinEcore.g:15247:2: rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_78);
            rule__SysMLCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__1"


    // $ANTLR start "rule__SysMLCS__Group__1__Impl"
    // InternalOCLinEcore.g:15254:1: rule__SysMLCS__Group__1__Impl : ( 'sysml' ) ;
    public final void rule__SysMLCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15258:1: ( ( 'sysml' ) )
            // InternalOCLinEcore.g:15259:1: ( 'sysml' )
            {
            // InternalOCLinEcore.g:15259:1: ( 'sysml' )
            // InternalOCLinEcore.g:15260:1: 'sysml'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSysmlKeyword_1());
            }
            match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getSysmlKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__1__Impl"


    // $ANTLR start "rule__SysMLCS__Group__2"
    // InternalOCLinEcore.g:15273:1: rule__SysMLCS__Group__2 : rule__SysMLCS__Group__2__Impl ;
    public final void rule__SysMLCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15277:1: ( rule__SysMLCS__Group__2__Impl )
            // InternalOCLinEcore.g:15278:2: rule__SysMLCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__2"


    // $ANTLR start "rule__SysMLCS__Group__2__Impl"
    // InternalOCLinEcore.g:15284:1: rule__SysMLCS__Group__2__Impl : ( ( rule__SysMLCS__Alternatives_2 ) ) ;
    public final void rule__SysMLCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15288:1: ( ( ( rule__SysMLCS__Alternatives_2 ) ) )
            // InternalOCLinEcore.g:15289:1: ( ( rule__SysMLCS__Alternatives_2 ) )
            {
            // InternalOCLinEcore.g:15289:1: ( ( rule__SysMLCS__Alternatives_2 ) )
            // InternalOCLinEcore.g:15290:1: ( rule__SysMLCS__Alternatives_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:15291:1: ( rule__SysMLCS__Alternatives_2 )
            // InternalOCLinEcore.g:15291:2: rule__SysMLCS__Alternatives_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Alternatives_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getAlternatives_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group__2__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_0__0"
    // InternalOCLinEcore.g:15307:1: rule__SysMLCS__Group_2_0__0 : rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 ;
    public final void rule__SysMLCS__Group_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15311:1: ( rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 )
            // InternalOCLinEcore.g:15312:2: rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_52);
            rule__SysMLCS__Group_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_0__0"


    // $ANTLR start "rule__SysMLCS__Group_2_0__0__Impl"
    // InternalOCLinEcore.g:15319:1: rule__SysMLCS__Group_2_0__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) ;
    public final void rule__SysMLCS__Group_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15323:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) )
            // InternalOCLinEcore.g:15324:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
            {
            // InternalOCLinEcore.g:15324:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
            // InternalOCLinEcore.g:15325:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_0_0());
            }
            // InternalOCLinEcore.g:15326:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
            // InternalOCLinEcore.g:15326:2: rule__SysMLCS__OwnedDetailsAssignment_2_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__OwnedDetailsAssignment_2_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_0__0__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_0__1"
    // InternalOCLinEcore.g:15336:1: rule__SysMLCS__Group_2_0__1 : rule__SysMLCS__Group_2_0__1__Impl ;
    public final void rule__SysMLCS__Group_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15340:1: ( rule__SysMLCS__Group_2_0__1__Impl )
            // InternalOCLinEcore.g:15341:2: rule__SysMLCS__Group_2_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_0__1"


    // $ANTLR start "rule__SysMLCS__Group_2_0__1__Impl"
    // InternalOCLinEcore.g:15347:1: rule__SysMLCS__Group_2_0__1__Impl : ( ';' ) ;
    public final void rule__SysMLCS__Group_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15351:1: ( ( ';' ) )
            // InternalOCLinEcore.g:15352:1: ( ';' )
            {
            // InternalOCLinEcore.g:15352:1: ( ';' )
            // InternalOCLinEcore.g:15353:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_0_1());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_0__1__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_1__0"
    // InternalOCLinEcore.g:15370:1: rule__SysMLCS__Group_2_1__0 : rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 ;
    public final void rule__SysMLCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15374:1: ( rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 )
            // InternalOCLinEcore.g:15375:2: rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_79);
            rule__SysMLCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__0"


    // $ANTLR start "rule__SysMLCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:15382:1: rule__SysMLCS__Group_2_1__0__Impl : ( '{' ) ;
    public final void rule__SysMLCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15386:1: ( ( '{' ) )
            // InternalOCLinEcore.g:15387:1: ( '{' )
            {
            // InternalOCLinEcore.g:15387:1: ( '{' )
            // InternalOCLinEcore.g:15388:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getLeftCurlyBracketKeyword_2_1_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getLeftCurlyBracketKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_1__1"
    // InternalOCLinEcore.g:15401:1: rule__SysMLCS__Group_2_1__1 : rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 ;
    public final void rule__SysMLCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15405:1: ( rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 )
            // InternalOCLinEcore.g:15406:2: rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2
            {
            pushFollow(FollowSets000.FOLLOW_79);
            rule__SysMLCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__1"


    // $ANTLR start "rule__SysMLCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:15413:1: rule__SysMLCS__Group_2_1__1__Impl : ( ( rule__SysMLCS__Group_2_1_1__0 )* ) ;
    public final void rule__SysMLCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15417:1: ( ( ( rule__SysMLCS__Group_2_1_1__0 )* ) )
            // InternalOCLinEcore.g:15418:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
            {
            // InternalOCLinEcore.g:15418:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
            // InternalOCLinEcore.g:15419:1: ( rule__SysMLCS__Group_2_1_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getGroup_2_1_1());
            }
            // InternalOCLinEcore.g:15420:1: ( rule__SysMLCS__Group_2_1_1__0 )*
            loop177:
            do {
                int alt177=2;
                int LA177_0 = input.LA(1);

                if ( (LA177_0==RULE_SINGLE_QUOTED_STRING||(LA177_0>=RULE_SIMPLE_ID && LA177_0<=RULE_ESCAPED_ID)||(LA177_0>=17 && LA177_0<=51)||(LA177_0>=54 && LA177_0<=60)) ) {
                    alt177=1;
                }


                switch (alt177) {
            	case 1 :
            	    // InternalOCLinEcore.g:15420:2: rule__SysMLCS__Group_2_1_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_80);
            	    rule__SysMLCS__Group_2_1_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getGroup_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_1__2"
    // InternalOCLinEcore.g:15430:1: rule__SysMLCS__Group_2_1__2 : rule__SysMLCS__Group_2_1__2__Impl ;
    public final void rule__SysMLCS__Group_2_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15434:1: ( rule__SysMLCS__Group_2_1__2__Impl )
            // InternalOCLinEcore.g:15435:2: rule__SysMLCS__Group_2_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__2"


    // $ANTLR start "rule__SysMLCS__Group_2_1__2__Impl"
    // InternalOCLinEcore.g:15441:1: rule__SysMLCS__Group_2_1__2__Impl : ( '}' ) ;
    public final void rule__SysMLCS__Group_2_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15445:1: ( ( '}' ) )
            // InternalOCLinEcore.g:15446:1: ( '}' )
            {
            // InternalOCLinEcore.g:15446:1: ( '}' )
            // InternalOCLinEcore.g:15447:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getRightCurlyBracketKeyword_2_1_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getRightCurlyBracketKeyword_2_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1__2__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_1_1__0"
    // InternalOCLinEcore.g:15466:1: rule__SysMLCS__Group_2_1_1__0 : rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 ;
    public final void rule__SysMLCS__Group_2_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15470:1: ( rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 )
            // InternalOCLinEcore.g:15471:2: rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_52);
            rule__SysMLCS__Group_2_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1_1__0"


    // $ANTLR start "rule__SysMLCS__Group_2_1_1__0__Impl"
    // InternalOCLinEcore.g:15478:1: rule__SysMLCS__Group_2_1_1__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) ;
    public final void rule__SysMLCS__Group_2_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15482:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) )
            // InternalOCLinEcore.g:15483:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
            {
            // InternalOCLinEcore.g:15483:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
            // InternalOCLinEcore.g:15484:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_1_1_0());
            }
            // InternalOCLinEcore.g:15485:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
            // InternalOCLinEcore.g:15485:2: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1_1__0__Impl"


    // $ANTLR start "rule__SysMLCS__Group_2_1_1__1"
    // InternalOCLinEcore.g:15495:1: rule__SysMLCS__Group_2_1_1__1 : rule__SysMLCS__Group_2_1_1__1__Impl ;
    public final void rule__SysMLCS__Group_2_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15499:1: ( rule__SysMLCS__Group_2_1_1__1__Impl )
            // InternalOCLinEcore.g:15500:2: rule__SysMLCS__Group_2_1_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SysMLCS__Group_2_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1_1__1"


    // $ANTLR start "rule__SysMLCS__Group_2_1_1__1__Impl"
    // InternalOCLinEcore.g:15506:1: rule__SysMLCS__Group_2_1_1__1__Impl : ( ';' ) ;
    public final void rule__SysMLCS__Group_2_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15510:1: ( ( ';' ) )
            // InternalOCLinEcore.g:15511:1: ( ';' )
            {
            // InternalOCLinEcore.g:15511:1: ( ';' )
            // InternalOCLinEcore.g:15512:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_1_1_1());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__Group_2_1_1__1__Impl"


    // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0"
    // InternalOCLinEcore.g:15529:1: rule__TypedMultiplicityRefCS__Group__0 : rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 ;
    public final void rule__TypedMultiplicityRefCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15533:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
            // InternalOCLinEcore.g:15534:2: rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_81);
            rule__TypedMultiplicityRefCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedMultiplicityRefCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedMultiplicityRefCS__Group__0"


    // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0__Impl"
    // InternalOCLinEcore.g:15541:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ruleTypedRefCS ) ;
    public final void rule__TypedMultiplicityRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15545:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:15546:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:15546:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:15547:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedRefCSParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedRefCSParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedMultiplicityRefCS__Group__0__Impl"


    // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1"
    // InternalOCLinEcore.g:15558:1: rule__TypedMultiplicityRefCS__Group__1 : rule__TypedMultiplicityRefCS__Group__1__Impl ;
    public final void rule__TypedMultiplicityRefCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15562:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
            // InternalOCLinEcore.g:15563:2: rule__TypedMultiplicityRefCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedMultiplicityRefCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedMultiplicityRefCS__Group__1"


    // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1__Impl"
    // InternalOCLinEcore.g:15569:1: rule__TypedMultiplicityRefCS__Group__1__Impl : ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) ;
    public final void rule__TypedMultiplicityRefCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15573:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:15574:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:15574:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:15575:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:15576:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
            int alt178=2;
            int LA178_0 = input.LA(1);

            if ( (LA178_0==117) ) {
                alt178=1;
            }
            switch (alt178) {
                case 1 :
                    // InternalOCLinEcore.g:15576:2: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedMultiplicityRefCS__Group__1__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__0"
    // InternalOCLinEcore.g:15590:1: rule__TemplateSignatureCS__Group_0__0 : rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 ;
    public final void rule__TemplateSignatureCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15594:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
            // InternalOCLinEcore.g:15595:2: rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TemplateSignatureCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__0"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:15602:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
    public final void rule__TemplateSignatureCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15606:1: ( ( '(' ) )
            // InternalOCLinEcore.g:15607:1: ( '(' )
            {
            // InternalOCLinEcore.g:15607:1: ( '(' )
            // InternalOCLinEcore.g:15608:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__0__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__1"
    // InternalOCLinEcore.g:15621:1: rule__TemplateSignatureCS__Group_0__1 : rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 ;
    public final void rule__TemplateSignatureCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15625:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
            // InternalOCLinEcore.g:15626:2: rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__TemplateSignatureCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__1"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:15633:1: rule__TemplateSignatureCS__Group_0__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) ;
    public final void rule__TemplateSignatureCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15637:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:15638:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:15638:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
            // InternalOCLinEcore.g:15639:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_1());
            }
            // InternalOCLinEcore.g:15640:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
            // InternalOCLinEcore.g:15640:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__OwnedParametersAssignment_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__1__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__2"
    // InternalOCLinEcore.g:15650:1: rule__TemplateSignatureCS__Group_0__2 : rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 ;
    public final void rule__TemplateSignatureCS__Group_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15654:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
            // InternalOCLinEcore.g:15655:2: rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3
            {
            pushFollow(FollowSets000.FOLLOW_19);
            rule__TemplateSignatureCS__Group_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__2"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__2__Impl"
    // InternalOCLinEcore.g:15662:1: rule__TemplateSignatureCS__Group_0__2__Impl : ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) ;
    public final void rule__TemplateSignatureCS__Group_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15666:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
            // InternalOCLinEcore.g:15667:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
            {
            // InternalOCLinEcore.g:15667:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
            // InternalOCLinEcore.g:15668:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0_2());
            }
            // InternalOCLinEcore.g:15669:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
            loop179:
            do {
                int alt179=2;
                int LA179_0 = input.LA(1);

                if ( (LA179_0==105) ) {
                    alt179=1;
                }


                switch (alt179) {
            	case 1 :
            	    // InternalOCLinEcore.g:15669:2: rule__TemplateSignatureCS__Group_0_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TemplateSignatureCS__Group_0_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getGroup_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__2__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__3"
    // InternalOCLinEcore.g:15679:1: rule__TemplateSignatureCS__Group_0__3 : rule__TemplateSignatureCS__Group_0__3__Impl ;
    public final void rule__TemplateSignatureCS__Group_0__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15683:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
            // InternalOCLinEcore.g:15684:2: rule__TemplateSignatureCS__Group_0__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__3"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0__3__Impl"
    // InternalOCLinEcore.g:15690:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
    public final void rule__TemplateSignatureCS__Group_0__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15694:1: ( ( ')' ) )
            // InternalOCLinEcore.g:15695:1: ( ')' )
            {
            // InternalOCLinEcore.g:15695:1: ( ')' )
            // InternalOCLinEcore.g:15696:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0__3__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0"
    // InternalOCLinEcore.g:15717:1: rule__TemplateSignatureCS__Group_0_2__0 : rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 ;
    public final void rule__TemplateSignatureCS__Group_0_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15721:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
            // InternalOCLinEcore.g:15722:2: rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TemplateSignatureCS__Group_0_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0_2__0"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0__Impl"
    // InternalOCLinEcore.g:15729:1: rule__TemplateSignatureCS__Group_0_2__0__Impl : ( ',' ) ;
    public final void rule__TemplateSignatureCS__Group_0_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15733:1: ( ( ',' ) )
            // InternalOCLinEcore.g:15734:1: ( ',' )
            {
            // InternalOCLinEcore.g:15734:1: ( ',' )
            // InternalOCLinEcore.g:15735:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0_2__0__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1"
    // InternalOCLinEcore.g:15748:1: rule__TemplateSignatureCS__Group_0_2__1 : rule__TemplateSignatureCS__Group_0_2__1__Impl ;
    public final void rule__TemplateSignatureCS__Group_0_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15752:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
            // InternalOCLinEcore.g:15753:2: rule__TemplateSignatureCS__Group_0_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_0_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0_2__1"


    // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1__Impl"
    // InternalOCLinEcore.g:15759:1: rule__TemplateSignatureCS__Group_0_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) ;
    public final void rule__TemplateSignatureCS__Group_0_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15763:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
            // InternalOCLinEcore.g:15764:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
            {
            // InternalOCLinEcore.g:15764:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
            // InternalOCLinEcore.g:15765:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_2_1());
            }
            // InternalOCLinEcore.g:15766:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
            // InternalOCLinEcore.g:15766:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_0_2__1__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__0"
    // InternalOCLinEcore.g:15780:1: rule__TemplateSignatureCS__Group_1__0 : rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 ;
    public final void rule__TemplateSignatureCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15784:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
            // InternalOCLinEcore.g:15785:2: rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TemplateSignatureCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__0"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:15792:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
    public final void rule__TemplateSignatureCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15796:1: ( ( '<' ) )
            // InternalOCLinEcore.g:15797:1: ( '<' )
            {
            // InternalOCLinEcore.g:15797:1: ( '<' )
            // InternalOCLinEcore.g:15798:1: '<'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
            }
            match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__0__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__1"
    // InternalOCLinEcore.g:15811:1: rule__TemplateSignatureCS__Group_1__1 : rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 ;
    public final void rule__TemplateSignatureCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15815:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
            // InternalOCLinEcore.g:15816:2: rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_82);
            rule__TemplateSignatureCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__1"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:15823:1: rule__TemplateSignatureCS__Group_1__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) ;
    public final void rule__TemplateSignatureCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15827:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15828:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15828:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
            // InternalOCLinEcore.g:15829:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_1());
            }
            // InternalOCLinEcore.g:15830:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
            // InternalOCLinEcore.g:15830:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__OwnedParametersAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__1__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__2"
    // InternalOCLinEcore.g:15840:1: rule__TemplateSignatureCS__Group_1__2 : rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 ;
    public final void rule__TemplateSignatureCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15844:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
            // InternalOCLinEcore.g:15845:2: rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3
            {
            pushFollow(FollowSets000.FOLLOW_82);
            rule__TemplateSignatureCS__Group_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__2"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:15852:1: rule__TemplateSignatureCS__Group_1__2__Impl : ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) ;
    public final void rule__TemplateSignatureCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15856:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
            // InternalOCLinEcore.g:15857:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
            {
            // InternalOCLinEcore.g:15857:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
            // InternalOCLinEcore.g:15858:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1_2());
            }
            // InternalOCLinEcore.g:15859:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
            loop180:
            do {
                int alt180=2;
                int LA180_0 = input.LA(1);

                if ( (LA180_0==105) ) {
                    alt180=1;
                }


                switch (alt180) {
            	case 1 :
            	    // InternalOCLinEcore.g:15859:2: rule__TemplateSignatureCS__Group_1_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TemplateSignatureCS__Group_1_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getGroup_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__2__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__3"
    // InternalOCLinEcore.g:15869:1: rule__TemplateSignatureCS__Group_1__3 : rule__TemplateSignatureCS__Group_1__3__Impl ;
    public final void rule__TemplateSignatureCS__Group_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15873:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
            // InternalOCLinEcore.g:15874:2: rule__TemplateSignatureCS__Group_1__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__3"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1__3__Impl"
    // InternalOCLinEcore.g:15880:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
    public final void rule__TemplateSignatureCS__Group_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15884:1: ( ( '>' ) )
            // InternalOCLinEcore.g:15885:1: ( '>' )
            {
            // InternalOCLinEcore.g:15885:1: ( '>' )
            // InternalOCLinEcore.g:15886:1: '>'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());
            }
            match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1__3__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0"
    // InternalOCLinEcore.g:15907:1: rule__TemplateSignatureCS__Group_1_2__0 : rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 ;
    public final void rule__TemplateSignatureCS__Group_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15911:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
            // InternalOCLinEcore.g:15912:2: rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TemplateSignatureCS__Group_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1_2__0"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0__Impl"
    // InternalOCLinEcore.g:15919:1: rule__TemplateSignatureCS__Group_1_2__0__Impl : ( ',' ) ;
    public final void rule__TemplateSignatureCS__Group_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15923:1: ( ( ',' ) )
            // InternalOCLinEcore.g:15924:1: ( ',' )
            {
            // InternalOCLinEcore.g:15924:1: ( ',' )
            // InternalOCLinEcore.g:15925:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1_2__0__Impl"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1"
    // InternalOCLinEcore.g:15938:1: rule__TemplateSignatureCS__Group_1_2__1 : rule__TemplateSignatureCS__Group_1_2__1__Impl ;
    public final void rule__TemplateSignatureCS__Group_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15942:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
            // InternalOCLinEcore.g:15943:2: rule__TemplateSignatureCS__Group_1_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__Group_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1_2__1"


    // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1__Impl"
    // InternalOCLinEcore.g:15949:1: rule__TemplateSignatureCS__Group_1_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) ;
    public final void rule__TemplateSignatureCS__Group_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15953:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
            // InternalOCLinEcore.g:15954:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
            {
            // InternalOCLinEcore.g:15954:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
            // InternalOCLinEcore.g:15955:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_2_1());
            }
            // InternalOCLinEcore.g:15956:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
            // InternalOCLinEcore.g:15956:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__Group_1_2__1__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group__0"
    // InternalOCLinEcore.g:15970:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
    public final void rule__TypedTypeRefCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15974:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
            // InternalOCLinEcore.g:15975:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_83);
            rule__TypedTypeRefCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group__0"


    // $ANTLR start "rule__TypedTypeRefCS__Group__0__Impl"
    // InternalOCLinEcore.g:15982:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
    public final void rule__TypedTypeRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15986:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:15987:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:15987:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:15988:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:15989:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:15989:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__OwnedPathNameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group__0__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group__1"
    // InternalOCLinEcore.g:15999:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
    public final void rule__TypedTypeRefCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16003:1: ( rule__TypedTypeRefCS__Group__1__Impl )
            // InternalOCLinEcore.g:16004:2: rule__TypedTypeRefCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group__1"


    // $ANTLR start "rule__TypedTypeRefCS__Group__1__Impl"
    // InternalOCLinEcore.g:16010:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) ;
    public final void rule__TypedTypeRefCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16014:1: ( ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) )
            // InternalOCLinEcore.g:16015:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
            {
            // InternalOCLinEcore.g:16015:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
            // InternalOCLinEcore.g:16016:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getAlternatives_1());
            }
            // InternalOCLinEcore.g:16017:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
            int alt181=2;
            int LA181_0 = input.LA(1);

            if ( (LA181_0==68||LA181_0==102) ) {
                alt181=1;
            }
            switch (alt181) {
                case 1 :
                    // InternalOCLinEcore.g:16017:2: rule__TypedTypeRefCS__Alternatives_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypedTypeRefCS__Alternatives_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getAlternatives_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group__1__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__0"
    // InternalOCLinEcore.g:16031:1: rule__TypedTypeRefCS__Group_1_0__0 : rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 ;
    public final void rule__TypedTypeRefCS__Group_1_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16035:1: ( rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 )
            // InternalOCLinEcore.g:16036:2: rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1
            {
            pushFollow(FollowSets000.FOLLOW_84);
            rule__TypedTypeRefCS__Group_1_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__0"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__0__Impl"
    // InternalOCLinEcore.g:16043:1: rule__TypedTypeRefCS__Group_1_0__0__Impl : ( '(' ) ;
    public final void rule__TypedTypeRefCS__Group_1_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16047:1: ( ( '(' ) )
            // InternalOCLinEcore.g:16048:1: ( '(' )
            {
            // InternalOCLinEcore.g:16048:1: ( '(' )
            // InternalOCLinEcore.g:16049:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__0__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__1"
    // InternalOCLinEcore.g:16062:1: rule__TypedTypeRefCS__Group_1_0__1 : rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 ;
    public final void rule__TypedTypeRefCS__Group_1_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16066:1: ( rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 )
            // InternalOCLinEcore.g:16067:2: rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__TypedTypeRefCS__Group_1_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__1"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__1__Impl"
    // InternalOCLinEcore.g:16074:1: rule__TypedTypeRefCS__Group_1_0__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) ;
    public final void rule__TypedTypeRefCS__Group_1_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16078:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) )
            // InternalOCLinEcore.g:16079:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
            {
            // InternalOCLinEcore.g:16079:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
            // InternalOCLinEcore.g:16080:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_0_1());
            }
            // InternalOCLinEcore.g:16081:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
            // InternalOCLinEcore.g:16081:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__1__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__2"
    // InternalOCLinEcore.g:16091:1: rule__TypedTypeRefCS__Group_1_0__2 : rule__TypedTypeRefCS__Group_1_0__2__Impl ;
    public final void rule__TypedTypeRefCS__Group_1_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16095:1: ( rule__TypedTypeRefCS__Group_1_0__2__Impl )
            // InternalOCLinEcore.g:16096:2: rule__TypedTypeRefCS__Group_1_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__2"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__2__Impl"
    // InternalOCLinEcore.g:16102:1: rule__TypedTypeRefCS__Group_1_0__2__Impl : ( ')' ) ;
    public final void rule__TypedTypeRefCS__Group_1_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16106:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16107:1: ( ')' )
            {
            // InternalOCLinEcore.g:16107:1: ( ')' )
            // InternalOCLinEcore.g:16108:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_0_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_0__2__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0"
    // InternalOCLinEcore.g:16127:1: rule__TypedTypeRefCS__Group_1_1__0 : rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 ;
    public final void rule__TypedTypeRefCS__Group_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16131:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
            // InternalOCLinEcore.g:16132:2: rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_84);
            rule__TypedTypeRefCS__Group_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__0"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0__Impl"
    // InternalOCLinEcore.g:16139:1: rule__TypedTypeRefCS__Group_1_1__0__Impl : ( '<' ) ;
    public final void rule__TypedTypeRefCS__Group_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16143:1: ( ( '<' ) )
            // InternalOCLinEcore.g:16144:1: ( '<' )
            {
            // InternalOCLinEcore.g:16144:1: ( '<' )
            // InternalOCLinEcore.g:16145:1: '<'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getLessThanSignKeyword_1_1_0());
            }
            match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getLessThanSignKeyword_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__0__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1"
    // InternalOCLinEcore.g:16158:1: rule__TypedTypeRefCS__Group_1_1__1 : rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 ;
    public final void rule__TypedTypeRefCS__Group_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16162:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
            // InternalOCLinEcore.g:16163:2: rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_85);
            rule__TypedTypeRefCS__Group_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__1"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1__Impl"
    // InternalOCLinEcore.g:16170:1: rule__TypedTypeRefCS__Group_1_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) ;
    public final void rule__TypedTypeRefCS__Group_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16174:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:16175:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:16175:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:16176:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:16177:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
            // InternalOCLinEcore.g:16177:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__1__Impl"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2"
    // InternalOCLinEcore.g:16187:1: rule__TypedTypeRefCS__Group_1_1__2 : rule__TypedTypeRefCS__Group_1_1__2__Impl ;
    public final void rule__TypedTypeRefCS__Group_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16191:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:16192:2: rule__TypedTypeRefCS__Group_1_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypedTypeRefCS__Group_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__2"


    // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2__Impl"
    // InternalOCLinEcore.g:16198:1: rule__TypedTypeRefCS__Group_1_1__2__Impl : ( '>' ) ;
    public final void rule__TypedTypeRefCS__Group_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16202:1: ( ( '>' ) )
            // InternalOCLinEcore.g:16203:1: ( '>' )
            {
            // InternalOCLinEcore.g:16203:1: ( '>' )
            // InternalOCLinEcore.g:16204:1: '>'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getGreaterThanSignKeyword_1_1_2());
            }
            match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getGreaterThanSignKeyword_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__Group_1_1__2__Impl"


    // $ANTLR start "rule__URIPathNameCS__Group__0"
    // InternalOCLinEcore.g:16223:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
    public final void rule__URIPathNameCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16227:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
            // InternalOCLinEcore.g:16228:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_86);
            rule__URIPathNameCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group__0"


    // $ANTLR start "rule__URIPathNameCS__Group__0__Impl"
    // InternalOCLinEcore.g:16235:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
    public final void rule__URIPathNameCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16239:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
            // InternalOCLinEcore.g:16240:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16240:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
            // InternalOCLinEcore.g:16241:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }
            // InternalOCLinEcore.g:16242:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
            // InternalOCLinEcore.g:16242:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__OwnedPathElementsAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group__0__Impl"


    // $ANTLR start "rule__URIPathNameCS__Group__1"
    // InternalOCLinEcore.g:16252:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
    public final void rule__URIPathNameCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16256:1: ( rule__URIPathNameCS__Group__1__Impl )
            // InternalOCLinEcore.g:16257:2: rule__URIPathNameCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group__1"


    // $ANTLR start "rule__URIPathNameCS__Group__1__Impl"
    // InternalOCLinEcore.g:16263:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
    public final void rule__URIPathNameCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16267:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:16268:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:16268:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
            // InternalOCLinEcore.g:16269:1: ( rule__URIPathNameCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:16270:1: ( rule__URIPathNameCS__Group_1__0 )*
            loop182:
            do {
                int alt182=2;
                int LA182_0 = input.LA(1);

                if ( (LA182_0==109) ) {
                    alt182=1;
                }


                switch (alt182) {
            	case 1 :
            	    // InternalOCLinEcore.g:16270:2: rule__URIPathNameCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_87);
            	    rule__URIPathNameCS__Group_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group__1__Impl"


    // $ANTLR start "rule__URIPathNameCS__Group_1__0"
    // InternalOCLinEcore.g:16284:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
    public final void rule__URIPathNameCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16288:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
            // InternalOCLinEcore.g:16289:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_88);
            rule__URIPathNameCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group_1__0"


    // $ANTLR start "rule__URIPathNameCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:16296:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
    public final void rule__URIPathNameCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16300:1: ( ( '::' ) )
            // InternalOCLinEcore.g:16301:1: ( '::' )
            {
            // InternalOCLinEcore.g:16301:1: ( '::' )
            // InternalOCLinEcore.g:16302:1: '::'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
            }
            match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group_1__0__Impl"


    // $ANTLR start "rule__URIPathNameCS__Group_1__1"
    // InternalOCLinEcore.g:16315:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
    public final void rule__URIPathNameCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16319:1: ( rule__URIPathNameCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:16320:2: rule__URIPathNameCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group_1__1"


    // $ANTLR start "rule__URIPathNameCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:16326:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
    public final void rule__URIPathNameCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16330:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:16331:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:16331:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
            // InternalOCLinEcore.g:16332:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }
            // InternalOCLinEcore.g:16333:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
            // InternalOCLinEcore.g:16333:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIPathNameCS__OwnedPathElementsAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__Group_1__1__Impl"


    // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0"
    // InternalOCLinEcore.g:16347:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
    public final void rule__URIFirstPathElementCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16351:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
            // InternalOCLinEcore.g:16352:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__URIFirstPathElementCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIFirstPathElementCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__Group_1__0"


    // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:16359:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
    public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16363:1: ( ( () ) )
            // InternalOCLinEcore.g:16364:1: ( () )
            {
            // InternalOCLinEcore.g:16364:1: ( () )
            // InternalOCLinEcore.g:16365:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
            }
            // InternalOCLinEcore.g:16366:1: ()
            // InternalOCLinEcore.g:16368:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__Group_1__0__Impl"


    // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1"
    // InternalOCLinEcore.g:16378:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
    public final void rule__URIFirstPathElementCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16382:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:16383:2: rule__URIFirstPathElementCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIFirstPathElementCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__Group_1__1"


    // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:16389:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
    public final void rule__URIFirstPathElementCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16393:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:16394:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:16394:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
            // InternalOCLinEcore.g:16395:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
            }
            // InternalOCLinEcore.g:16396:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
            // InternalOCLinEcore.g:16396:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__URIFirstPathElementCS__ReferredElementAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__Group_1__1__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group__0"
    // InternalOCLinEcore.g:16410:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
    public final void rule__CollectionTypeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16414:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
            // InternalOCLinEcore.g:16415:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__CollectionTypeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group__0"


    // $ANTLR start "rule__CollectionTypeCS__Group__0__Impl"
    // InternalOCLinEcore.g:16422:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
    public final void rule__CollectionTypeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16426:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:16427:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16427:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:16428:1: ( rule__CollectionTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:16429:1: ( rule__CollectionTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:16429:2: rule__CollectionTypeCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group__0__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group__1"
    // InternalOCLinEcore.g:16439:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
    public final void rule__CollectionTypeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16443:1: ( rule__CollectionTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:16444:2: rule__CollectionTypeCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group__1"


    // $ANTLR start "rule__CollectionTypeCS__Group__1__Impl"
    // InternalOCLinEcore.g:16450:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
    public final void rule__CollectionTypeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16454:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:16455:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:16455:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:16456:1: ( rule__CollectionTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:16457:1: ( rule__CollectionTypeCS__Group_1__0 )?
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( (LA183_0==102) ) {
                alt183=1;
            }
            switch (alt183) {
                case 1 :
                    // InternalOCLinEcore.g:16457:2: rule__CollectionTypeCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionTypeCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group__1__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__0"
    // InternalOCLinEcore.g:16471:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
    public final void rule__CollectionTypeCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16475:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:16476:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__CollectionTypeCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__0"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:16483:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16487:1: ( ( '(' ) )
            // InternalOCLinEcore.g:16488:1: ( '(' )
            {
            // InternalOCLinEcore.g:16488:1: ( '(' )
            // InternalOCLinEcore.g:16489:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__0__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__1"
    // InternalOCLinEcore.g:16502:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
    public final void rule__CollectionTypeCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16506:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:16507:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_89);
            rule__CollectionTypeCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__1"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:16514:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
    public final void rule__CollectionTypeCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16518:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:16519:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:16519:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:16520:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:16521:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:16521:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__OwnedTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__1__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__2"
    // InternalOCLinEcore.g:16531:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
    public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16535:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
            // InternalOCLinEcore.g:16536:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
            {
            pushFollow(FollowSets000.FOLLOW_89);
            rule__CollectionTypeCS__Group_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__2"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:16543:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
    public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16547:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
            // InternalOCLinEcore.g:16548:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
            {
            // InternalOCLinEcore.g:16548:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
            // InternalOCLinEcore.g:16549:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
            }
            // InternalOCLinEcore.g:16550:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
            int alt184=2;
            int LA184_0 = input.LA(1);

            if ( (LA184_0==117) ) {
                alt184=1;
            }
            switch (alt184) {
                case 1 :
                    // InternalOCLinEcore.g:16550:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__2__Impl"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__3"
    // InternalOCLinEcore.g:16560:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
    public final void rule__CollectionTypeCS__Group_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16564:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
            // InternalOCLinEcore.g:16565:2: rule__CollectionTypeCS__Group_1__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__Group_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__3"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__3__Impl"
    // InternalOCLinEcore.g:16571:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
    public final void rule__CollectionTypeCS__Group_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16575:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16576:1: ( ')' )
            {
            // InternalOCLinEcore.g:16576:1: ( ')' )
            // InternalOCLinEcore.g:16577:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__Group_1__3__Impl"


    // $ANTLR start "rule__MapTypeCS__Group__0"
    // InternalOCLinEcore.g:16598:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
    public final void rule__MapTypeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16602:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
            // InternalOCLinEcore.g:16603:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__MapTypeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group__0"


    // $ANTLR start "rule__MapTypeCS__Group__0__Impl"
    // InternalOCLinEcore.g:16610:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
    public final void rule__MapTypeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16614:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:16615:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16615:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:16616:1: ( rule__MapTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:16617:1: ( rule__MapTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:16617:2: rule__MapTypeCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group__0__Impl"


    // $ANTLR start "rule__MapTypeCS__Group__1"
    // InternalOCLinEcore.g:16627:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
    public final void rule__MapTypeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16631:1: ( rule__MapTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:16632:2: rule__MapTypeCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group__1"


    // $ANTLR start "rule__MapTypeCS__Group__1__Impl"
    // InternalOCLinEcore.g:16638:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
    public final void rule__MapTypeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16642:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:16643:1: ( ( rule__MapTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:16643:1: ( ( rule__MapTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:16644:1: ( rule__MapTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:16645:1: ( rule__MapTypeCS__Group_1__0 )?
            int alt185=2;
            int LA185_0 = input.LA(1);

            if ( (LA185_0==102) ) {
                alt185=1;
            }
            switch (alt185) {
                case 1 :
                    // InternalOCLinEcore.g:16645:2: rule__MapTypeCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__MapTypeCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group__1__Impl"


    // $ANTLR start "rule__MapTypeCS__Group_1__0"
    // InternalOCLinEcore.g:16659:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
    public final void rule__MapTypeCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16663:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:16664:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__MapTypeCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__0"


    // $ANTLR start "rule__MapTypeCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:16671:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16675:1: ( ( '(' ) )
            // InternalOCLinEcore.g:16676:1: ( '(' )
            {
            // InternalOCLinEcore.g:16676:1: ( '(' )
            // InternalOCLinEcore.g:16677:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__0__Impl"


    // $ANTLR start "rule__MapTypeCS__Group_1__1"
    // InternalOCLinEcore.g:16690:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
    public final void rule__MapTypeCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16694:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:16695:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__MapTypeCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__1"


    // $ANTLR start "rule__MapTypeCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:16702:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
    public final void rule__MapTypeCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16706:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:16707:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:16707:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:16708:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:16709:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
            // InternalOCLinEcore.g:16709:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__OwnedKeyTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__1__Impl"


    // $ANTLR start "rule__MapTypeCS__Group_1__2"
    // InternalOCLinEcore.g:16719:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
    public final void rule__MapTypeCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16723:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
            // InternalOCLinEcore.g:16724:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__MapTypeCS__Group_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__2"


    // $ANTLR start "rule__MapTypeCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:16731:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
    public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16735:1: ( ( ',' ) )
            // InternalOCLinEcore.g:16736:1: ( ',' )
            {
            // InternalOCLinEcore.g:16736:1: ( ',' )
            // InternalOCLinEcore.g:16737:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__2__Impl"


    // $ANTLR start "rule__MapTypeCS__Group_1__3"
    // InternalOCLinEcore.g:16750:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
    public final void rule__MapTypeCS__Group_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16754:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
            // InternalOCLinEcore.g:16755:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__MapTypeCS__Group_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group_1__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__3"


    // $ANTLR start "rule__MapTypeCS__Group_1__3__Impl"
    // InternalOCLinEcore.g:16762:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
    public final void rule__MapTypeCS__Group_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16766:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
            // InternalOCLinEcore.g:16767:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
            {
            // InternalOCLinEcore.g:16767:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
            // InternalOCLinEcore.g:16768:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
            }
            // InternalOCLinEcore.g:16769:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
            // InternalOCLinEcore.g:16769:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__OwnedValueTypeAssignment_1_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__3__Impl"


    // $ANTLR start "rule__MapTypeCS__Group_1__4"
    // InternalOCLinEcore.g:16779:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
    public final void rule__MapTypeCS__Group_1__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16783:1: ( rule__MapTypeCS__Group_1__4__Impl )
            // InternalOCLinEcore.g:16784:2: rule__MapTypeCS__Group_1__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapTypeCS__Group_1__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__4"


    // $ANTLR start "rule__MapTypeCS__Group_1__4__Impl"
    // InternalOCLinEcore.g:16790:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
    public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16794:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16795:1: ( ')' )
            {
            // InternalOCLinEcore.g:16795:1: ( ')' )
            // InternalOCLinEcore.g:16796:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__Group_1__4__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group__0"
    // InternalOCLinEcore.g:16819:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
    public final void rule__TupleTypeCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16823:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
            // InternalOCLinEcore.g:16824:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__TupleTypeCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group__0"


    // $ANTLR start "rule__TupleTypeCS__Group__0__Impl"
    // InternalOCLinEcore.g:16831:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
    public final void rule__TupleTypeCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16835:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:16836:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16836:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:16837:1: ( rule__TupleTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:16838:1: ( rule__TupleTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:16838:2: rule__TupleTypeCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group__0__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group__1"
    // InternalOCLinEcore.g:16848:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
    public final void rule__TupleTypeCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16852:1: ( rule__TupleTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:16853:2: rule__TupleTypeCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group__1"


    // $ANTLR start "rule__TupleTypeCS__Group__1__Impl"
    // InternalOCLinEcore.g:16859:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
    public final void rule__TupleTypeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16863:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:16864:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:16864:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:16865:1: ( rule__TupleTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:16866:1: ( rule__TupleTypeCS__Group_1__0 )?
            int alt186=2;
            int LA186_0 = input.LA(1);

            if ( (LA186_0==102) ) {
                alt186=1;
            }
            switch (alt186) {
                case 1 :
                    // InternalOCLinEcore.g:16866:2: rule__TupleTypeCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TupleTypeCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group__1__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1__0"
    // InternalOCLinEcore.g:16880:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
    public final void rule__TupleTypeCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16884:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:16885:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_55);
            rule__TupleTypeCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__0"


    // $ANTLR start "rule__TupleTypeCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:16892:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16896:1: ( ( '(' ) )
            // InternalOCLinEcore.g:16897:1: ( '(' )
            {
            // InternalOCLinEcore.g:16897:1: ( '(' )
            // InternalOCLinEcore.g:16898:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__0__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1__1"
    // InternalOCLinEcore.g:16911:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
    public final void rule__TupleTypeCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16915:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:16916:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_55);
            rule__TupleTypeCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__1"


    // $ANTLR start "rule__TupleTypeCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:16923:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
    public final void rule__TupleTypeCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16927:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:16928:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:16928:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:16929:1: ( rule__TupleTypeCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:16930:1: ( rule__TupleTypeCS__Group_1_1__0 )?
            int alt187=2;
            int LA187_0 = input.LA(1);

            if ( ((LA187_0>=RULE_SIMPLE_ID && LA187_0<=RULE_ESCAPED_ID)||(LA187_0>=17 && LA187_0<=51)||(LA187_0>=54 && LA187_0<=60)) ) {
                alt187=1;
            }
            switch (alt187) {
                case 1 :
                    // InternalOCLinEcore.g:16930:2: rule__TupleTypeCS__Group_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TupleTypeCS__Group_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__1__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1__2"
    // InternalOCLinEcore.g:16940:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
    public final void rule__TupleTypeCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16944:1: ( rule__TupleTypeCS__Group_1__2__Impl )
            // InternalOCLinEcore.g:16945:2: rule__TupleTypeCS__Group_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__2"


    // $ANTLR start "rule__TupleTypeCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:16951:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
    public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16955:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16956:1: ( ')' )
            {
            // InternalOCLinEcore.g:16956:1: ( ')' )
            // InternalOCLinEcore.g:16957:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1__2__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1__0"
    // InternalOCLinEcore.g:16976:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
    public final void rule__TupleTypeCS__Group_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16980:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
            // InternalOCLinEcore.g:16981:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__TupleTypeCS__Group_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1__0"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1__0__Impl"
    // InternalOCLinEcore.g:16988:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
    public final void rule__TupleTypeCS__Group_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16992:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
            // InternalOCLinEcore.g:16993:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
            {
            // InternalOCLinEcore.g:16993:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
            // InternalOCLinEcore.g:16994:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
            }
            // InternalOCLinEcore.g:16995:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
            // InternalOCLinEcore.g:16995:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__OwnedPartsAssignment_1_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1__0__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1__1"
    // InternalOCLinEcore.g:17005:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
    public final void rule__TupleTypeCS__Group_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17009:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
            // InternalOCLinEcore.g:17010:2: rule__TupleTypeCS__Group_1_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1__1"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1__1__Impl"
    // InternalOCLinEcore.g:17016:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
    public final void rule__TupleTypeCS__Group_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17020:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
            // InternalOCLinEcore.g:17021:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
            {
            // InternalOCLinEcore.g:17021:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
            // InternalOCLinEcore.g:17022:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
            }
            // InternalOCLinEcore.g:17023:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
            loop188:
            do {
                int alt188=2;
                int LA188_0 = input.LA(1);

                if ( (LA188_0==105) ) {
                    alt188=1;
                }


                switch (alt188) {
            	case 1 :
            	    // InternalOCLinEcore.g:17023:2: rule__TupleTypeCS__Group_1_1_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TupleTypeCS__Group_1_1_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1__1__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0"
    // InternalOCLinEcore.g:17037:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
    public final void rule__TupleTypeCS__Group_1_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17041:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
            // InternalOCLinEcore.g:17042:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TupleTypeCS__Group_1_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1_1__0"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0__Impl"
    // InternalOCLinEcore.g:17049:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
    public final void rule__TupleTypeCS__Group_1_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17053:1: ( ( ',' ) )
            // InternalOCLinEcore.g:17054:1: ( ',' )
            {
            // InternalOCLinEcore.g:17054:1: ( ',' )
            // InternalOCLinEcore.g:17055:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1_1__0__Impl"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1"
    // InternalOCLinEcore.g:17068:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
    public final void rule__TupleTypeCS__Group_1_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17072:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
            // InternalOCLinEcore.g:17073:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__Group_1_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1_1__1"


    // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1__Impl"
    // InternalOCLinEcore.g:17079:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
    public final void rule__TupleTypeCS__Group_1_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17083:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
            // InternalOCLinEcore.g:17084:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
            {
            // InternalOCLinEcore.g:17084:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
            // InternalOCLinEcore.g:17085:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
            }
            // InternalOCLinEcore.g:17086:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
            // InternalOCLinEcore.g:17086:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__Group_1_1_1__1__Impl"


    // $ANTLR start "rule__TuplePartCS__Group__0"
    // InternalOCLinEcore.g:17100:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
    public final void rule__TuplePartCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17104:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
            // InternalOCLinEcore.g:17105:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__TuplePartCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__0"


    // $ANTLR start "rule__TuplePartCS__Group__0__Impl"
    // InternalOCLinEcore.g:17112:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
    public final void rule__TuplePartCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17116:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:17117:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17117:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:17118:1: ( rule__TuplePartCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:17119:1: ( rule__TuplePartCS__NameAssignment_0 )
            // InternalOCLinEcore.g:17119:2: rule__TuplePartCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__0__Impl"


    // $ANTLR start "rule__TuplePartCS__Group__1"
    // InternalOCLinEcore.g:17129:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
    public final void rule__TuplePartCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17133:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
            // InternalOCLinEcore.g:17134:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__TuplePartCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__1"


    // $ANTLR start "rule__TuplePartCS__Group__1__Impl"
    // InternalOCLinEcore.g:17141:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
    public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17145:1: ( ( ':' ) )
            // InternalOCLinEcore.g:17146:1: ( ':' )
            {
            // InternalOCLinEcore.g:17146:1: ( ':' )
            // InternalOCLinEcore.g:17147:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__1__Impl"


    // $ANTLR start "rule__TuplePartCS__Group__2"
    // InternalOCLinEcore.g:17160:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
    public final void rule__TuplePartCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17164:1: ( rule__TuplePartCS__Group__2__Impl )
            // InternalOCLinEcore.g:17165:2: rule__TuplePartCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__2"


    // $ANTLR start "rule__TuplePartCS__Group__2__Impl"
    // InternalOCLinEcore.g:17171:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
    public final void rule__TuplePartCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17175:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
            // InternalOCLinEcore.g:17176:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17176:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
            // InternalOCLinEcore.g:17177:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
            }
            // InternalOCLinEcore.g:17178:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
            // InternalOCLinEcore.g:17178:2: rule__TuplePartCS__OwnedTypeAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TuplePartCS__OwnedTypeAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__Group__2__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:17194:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
    public final void rule__CollectionLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17198:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:17199:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__CollectionLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__0"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:17206:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
    public final void rule__CollectionLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17210:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:17211:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17211:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:17212:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:17213:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:17213:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__OwnedTypeAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:17223:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
    public final void rule__CollectionLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17227:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:17228:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_90);
            rule__CollectionLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__1"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:17235:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17239:1: ( ( '{' ) )
            // InternalOCLinEcore.g:17240:1: ( '{' )
            {
            // InternalOCLinEcore.g:17240:1: ( '{' )
            // InternalOCLinEcore.g:17241:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__2"
    // InternalOCLinEcore.g:17254:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
    public final void rule__CollectionLiteralExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17258:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:17259:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_90);
            rule__CollectionLiteralExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__2"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:17266:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
    public final void rule__CollectionLiteralExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17270:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:17271:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:17271:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
            // InternalOCLinEcore.g:17272:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:17273:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
            int alt189=2;
            int LA189_0 = input.LA(1);

            if ( ((LA189_0>=RULE_INT && LA189_0<=RULE_SINGLE_QUOTED_STRING)||(LA189_0>=RULE_SIMPLE_ID && LA189_0<=RULE_ESCAPED_ID)||(LA189_0>=17 && LA189_0<=51)||(LA189_0>=54 && LA189_0<=64)||(LA189_0>=85 && LA189_0<=99)||LA189_0==102||LA189_0==104||LA189_0==112||(LA189_0>=114 && LA189_0<=115)||LA189_0==120||(LA189_0>=125 && LA189_0<=126)||(LA189_0>=139 && LA189_0<=140)) ) {
                alt189=1;
            }
            switch (alt189) {
                case 1 :
                    // InternalOCLinEcore.g:17273:2: rule__CollectionLiteralExpCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionLiteralExpCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__2__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__3"
    // InternalOCLinEcore.g:17283:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
    public final void rule__CollectionLiteralExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17287:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:17288:2: rule__CollectionLiteralExpCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__3"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:17294:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17298:1: ( ( '}' ) )
            // InternalOCLinEcore.g:17299:1: ( '}' )
            {
            // InternalOCLinEcore.g:17299:1: ( '}' )
            // InternalOCLinEcore.g:17300:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group__3__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0"
    // InternalOCLinEcore.g:17321:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
    public final void rule__CollectionLiteralExpCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17325:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
            // InternalOCLinEcore.g:17326:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__CollectionLiteralExpCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2__0"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:17333:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
    public final void rule__CollectionLiteralExpCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17337:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:17338:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:17338:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:17339:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:17340:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:17340:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2__0__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1"
    // InternalOCLinEcore.g:17350:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
    public final void rule__CollectionLiteralExpCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17354:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:17355:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2__1"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:17361:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
    public final void rule__CollectionLiteralExpCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17365:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:17366:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:17366:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:17367:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:17368:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
            loop190:
            do {
                int alt190=2;
                int LA190_0 = input.LA(1);

                if ( (LA190_0==105) ) {
                    alt190=1;
                }


                switch (alt190) {
            	case 1 :
            	    // InternalOCLinEcore.g:17368:2: rule__CollectionLiteralExpCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__CollectionLiteralExpCS__Group_2_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2__1__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0"
    // InternalOCLinEcore.g:17382:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
    public final void rule__CollectionLiteralExpCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17386:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
            // InternalOCLinEcore.g:17387:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__CollectionLiteralExpCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2_1__0"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:17394:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
    public final void rule__CollectionLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17398:1: ( ( ',' ) )
            // InternalOCLinEcore.g:17399:1: ( ',' )
            {
            // InternalOCLinEcore.g:17399:1: ( ',' )
            // InternalOCLinEcore.g:17400:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1"
    // InternalOCLinEcore.g:17413:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
    public final void rule__CollectionLiteralExpCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17417:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:17418:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2_1__1"


    // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:17424:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
    public final void rule__CollectionLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17428:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:17429:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:17429:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:17430:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:17431:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:17431:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0"
    // InternalOCLinEcore.g:17445:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
    public final void rule__CollectionLiteralPartCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17449:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
            // InternalOCLinEcore.g:17450:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_92);
            rule__CollectionLiteralPartCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0__0"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:17457:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
    public final void rule__CollectionLiteralPartCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17461:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
            // InternalOCLinEcore.g:17462:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
            {
            // InternalOCLinEcore.g:17462:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
            // InternalOCLinEcore.g:17463:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
            }
            // InternalOCLinEcore.g:17464:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
            // InternalOCLinEcore.g:17464:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0__0__Impl"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1"
    // InternalOCLinEcore.g:17474:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
    public final void rule__CollectionLiteralPartCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17478:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:17479:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0__1"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:17485:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
    public final void rule__CollectionLiteralPartCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17489:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
            // InternalOCLinEcore.g:17490:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
            {
            // InternalOCLinEcore.g:17490:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
            // InternalOCLinEcore.g:17491:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
            }
            // InternalOCLinEcore.g:17492:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
            int alt191=2;
            int LA191_0 = input.LA(1);

            if ( (LA191_0==110) ) {
                alt191=1;
            }
            switch (alt191) {
                case 1 :
                    // InternalOCLinEcore.g:17492:2: rule__CollectionLiteralPartCS__Group_0_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionLiteralPartCS__Group_0_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0__1__Impl"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0"
    // InternalOCLinEcore.g:17506:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
    public final void rule__CollectionLiteralPartCS__Group_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17510:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
            // InternalOCLinEcore.g:17511:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__CollectionLiteralPartCS__Group_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__Group_0_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0_1__0"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"
    // InternalOCLinEcore.g:17518:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
    public final void rule__CollectionLiteralPartCS__Group_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17522:1: ( ( '..' ) )
            // InternalOCLinEcore.g:17523:1: ( '..' )
            {
            // InternalOCLinEcore.g:17523:1: ( '..' )
            // InternalOCLinEcore.g:17524:1: '..'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
            }
            match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1"
    // InternalOCLinEcore.g:17537:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
    public final void rule__CollectionLiteralPartCS__Group_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17541:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:17542:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__Group_0_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0_1__1"


    // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"
    // InternalOCLinEcore.g:17548:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
    public final void rule__CollectionLiteralPartCS__Group_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17552:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
            // InternalOCLinEcore.g:17553:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
            {
            // InternalOCLinEcore.g:17553:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
            // InternalOCLinEcore.g:17554:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:17555:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
            // InternalOCLinEcore.g:17555:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group__0"
    // InternalOCLinEcore.g:17569:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
    public final void rule__CollectionPatternCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17573:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
            // InternalOCLinEcore.g:17574:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__CollectionPatternCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__0"


    // $ANTLR start "rule__CollectionPatternCS__Group__0__Impl"
    // InternalOCLinEcore.g:17581:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
    public final void rule__CollectionPatternCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17585:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:17586:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17586:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:17587:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:17588:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:17588:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__OwnedTypeAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__0__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group__1"
    // InternalOCLinEcore.g:17598:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
    public final void rule__CollectionPatternCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17602:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
            // InternalOCLinEcore.g:17603:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_90);
            rule__CollectionPatternCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__1"


    // $ANTLR start "rule__CollectionPatternCS__Group__1__Impl"
    // InternalOCLinEcore.g:17610:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17614:1: ( ( '{' ) )
            // InternalOCLinEcore.g:17615:1: ( '{' )
            {
            // InternalOCLinEcore.g:17615:1: ( '{' )
            // InternalOCLinEcore.g:17616:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__1__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group__2"
    // InternalOCLinEcore.g:17629:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
    public final void rule__CollectionPatternCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17633:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
            // InternalOCLinEcore.g:17634:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_90);
            rule__CollectionPatternCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__2"


    // $ANTLR start "rule__CollectionPatternCS__Group__2__Impl"
    // InternalOCLinEcore.g:17641:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
    public final void rule__CollectionPatternCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17645:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:17646:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:17646:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
            // InternalOCLinEcore.g:17647:1: ( rule__CollectionPatternCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:17648:1: ( rule__CollectionPatternCS__Group_2__0 )?
            int alt192=2;
            int LA192_0 = input.LA(1);

            if ( ((LA192_0>=RULE_SIMPLE_ID && LA192_0<=RULE_ESCAPED_ID)||(LA192_0>=17 && LA192_0<=51)||(LA192_0>=54 && LA192_0<=60)||LA192_0==104) ) {
                alt192=1;
            }
            switch (alt192) {
                case 1 :
                    // InternalOCLinEcore.g:17648:2: rule__CollectionPatternCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CollectionPatternCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__2__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group__3"
    // InternalOCLinEcore.g:17658:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
    public final void rule__CollectionPatternCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17662:1: ( rule__CollectionPatternCS__Group__3__Impl )
            // InternalOCLinEcore.g:17663:2: rule__CollectionPatternCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__3"


    // $ANTLR start "rule__CollectionPatternCS__Group__3__Impl"
    // InternalOCLinEcore.g:17669:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17673:1: ( ( '}' ) )
            // InternalOCLinEcore.g:17674:1: ( '}' )
            {
            // InternalOCLinEcore.g:17674:1: ( '}' )
            // InternalOCLinEcore.g:17675:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group__3__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__0"
    // InternalOCLinEcore.g:17696:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
    public final void rule__CollectionPatternCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17700:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
            // InternalOCLinEcore.g:17701:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_94);
            rule__CollectionPatternCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__0"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:17708:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
    public final void rule__CollectionPatternCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17712:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:17713:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:17713:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:17714:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:17715:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:17715:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__OwnedPartsAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__0__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__1"
    // InternalOCLinEcore.g:17725:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
    public final void rule__CollectionPatternCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17729:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
            // InternalOCLinEcore.g:17730:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
            {
            pushFollow(FollowSets000.FOLLOW_94);
            rule__CollectionPatternCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__1"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:17737:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
    public final void rule__CollectionPatternCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17741:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:17742:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:17742:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:17743:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:17744:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
            loop193:
            do {
                int alt193=2;
                int LA193_0 = input.LA(1);

                if ( (LA193_0==105) ) {
                    alt193=1;
                }


                switch (alt193) {
            	case 1 :
            	    // InternalOCLinEcore.g:17744:2: rule__CollectionPatternCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__CollectionPatternCS__Group_2_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__1__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__2"
    // InternalOCLinEcore.g:17754:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
    public final void rule__CollectionPatternCS__Group_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17758:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:17759:2: rule__CollectionPatternCS__Group_2__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__2"


    // $ANTLR start "rule__CollectionPatternCS__Group_2__2__Impl"
    // InternalOCLinEcore.g:17765:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
    public final void rule__CollectionPatternCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17769:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
            // InternalOCLinEcore.g:17770:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
            {
            // InternalOCLinEcore.g:17770:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
            // InternalOCLinEcore.g:17771:1: ( rule__CollectionPatternCS__Group_2_2__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:17772:1: ( rule__CollectionPatternCS__Group_2_2__0 )
            // InternalOCLinEcore.g:17772:2: rule__CollectionPatternCS__Group_2_2__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2_2__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2__2__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0"
    // InternalOCLinEcore.g:17788:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
    public final void rule__CollectionPatternCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17792:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
            // InternalOCLinEcore.g:17793:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__CollectionPatternCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_1__0"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:17800:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
    public final void rule__CollectionPatternCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17804:1: ( ( ',' ) )
            // InternalOCLinEcore.g:17805:1: ( ',' )
            {
            // InternalOCLinEcore.g:17805:1: ( ',' )
            // InternalOCLinEcore.g:17806:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1"
    // InternalOCLinEcore.g:17819:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
    public final void rule__CollectionPatternCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17823:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:17824:2: rule__CollectionPatternCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_1__1"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:17830:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
    public final void rule__CollectionPatternCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17834:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:17835:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:17835:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:17836:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:17837:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:17837:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0"
    // InternalOCLinEcore.g:17851:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
    public final void rule__CollectionPatternCS__Group_2_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17855:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
            // InternalOCLinEcore.g:17856:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
            {
            pushFollow(FollowSets000.FOLLOW_95);
            rule__CollectionPatternCS__Group_2_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_2__0"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0__Impl"
    // InternalOCLinEcore.g:17863:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
    public final void rule__CollectionPatternCS__Group_2_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17867:1: ( ( '++' ) )
            // InternalOCLinEcore.g:17868:1: ( '++' )
            {
            // InternalOCLinEcore.g:17868:1: ( '++' )
            // InternalOCLinEcore.g:17869:1: '++'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
            }
            match(input,111,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_2__0__Impl"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1"
    // InternalOCLinEcore.g:17882:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
    public final void rule__CollectionPatternCS__Group_2_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17886:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:17887:2: rule__CollectionPatternCS__Group_2_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__Group_2_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_2__1"


    // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1__Impl"
    // InternalOCLinEcore.g:17893:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
    public final void rule__CollectionPatternCS__Group_2_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17897:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:17898:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:17898:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:17899:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:17900:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
            // InternalOCLinEcore.g:17900:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__Group_2_2__1__Impl"


    // $ANTLR start "rule__ShadowPartCS__Group_0__0"
    // InternalOCLinEcore.g:17914:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
    public final void rule__ShadowPartCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17918:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
            // InternalOCLinEcore.g:17919:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__ShadowPartCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__0"


    // $ANTLR start "rule__ShadowPartCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:17926:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
    public final void rule__ShadowPartCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17930:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
            // InternalOCLinEcore.g:17931:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
            {
            // InternalOCLinEcore.g:17931:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
            // InternalOCLinEcore.g:17932:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
            }
            // InternalOCLinEcore.g:17933:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
            // InternalOCLinEcore.g:17933:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__ReferredPropertyAssignment_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__0__Impl"


    // $ANTLR start "rule__ShadowPartCS__Group_0__1"
    // InternalOCLinEcore.g:17943:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
    public final void rule__ShadowPartCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17947:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
            // InternalOCLinEcore.g:17948:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__ShadowPartCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__1"


    // $ANTLR start "rule__ShadowPartCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:17955:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
    public final void rule__ShadowPartCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17959:1: ( ( '=' ) )
            // InternalOCLinEcore.g:17960:1: ( '=' )
            {
            // InternalOCLinEcore.g:17960:1: ( '=' )
            // InternalOCLinEcore.g:17961:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__1__Impl"


    // $ANTLR start "rule__ShadowPartCS__Group_0__2"
    // InternalOCLinEcore.g:17974:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
    public final void rule__ShadowPartCS__Group_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17978:1: ( rule__ShadowPartCS__Group_0__2__Impl )
            // InternalOCLinEcore.g:17979:2: rule__ShadowPartCS__Group_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__2"


    // $ANTLR start "rule__ShadowPartCS__Group_0__2__Impl"
    // InternalOCLinEcore.g:17985:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
    public final void rule__ShadowPartCS__Group_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17989:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
            // InternalOCLinEcore.g:17990:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
            {
            // InternalOCLinEcore.g:17990:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
            // InternalOCLinEcore.g:17991:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
            }
            // InternalOCLinEcore.g:17992:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
            // InternalOCLinEcore.g:17992:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__Group_0__2__Impl"


    // $ANTLR start "rule__PatternExpCS__Group__0"
    // InternalOCLinEcore.g:18008:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
    public final void rule__PatternExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18012:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
            // InternalOCLinEcore.g:18013:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__PatternExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PatternExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__0"


    // $ANTLR start "rule__PatternExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:18020:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
    public final void rule__PatternExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18024:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
            // InternalOCLinEcore.g:18025:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
            {
            // InternalOCLinEcore.g:18025:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
            // InternalOCLinEcore.g:18026:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
            }
            // InternalOCLinEcore.g:18027:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
            int alt194=2;
            int LA194_0 = input.LA(1);

            if ( ((LA194_0>=RULE_SIMPLE_ID && LA194_0<=RULE_ESCAPED_ID)||(LA194_0>=17 && LA194_0<=51)||(LA194_0>=54 && LA194_0<=60)) ) {
                alt194=1;
            }
            switch (alt194) {
                case 1 :
                    // InternalOCLinEcore.g:18027:2: rule__PatternExpCS__PatternVariableNameAssignment_0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__PatternExpCS__PatternVariableNameAssignment_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__0__Impl"


    // $ANTLR start "rule__PatternExpCS__Group__1"
    // InternalOCLinEcore.g:18037:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
    public final void rule__PatternExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18041:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
            // InternalOCLinEcore.g:18042:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__PatternExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PatternExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__1"


    // $ANTLR start "rule__PatternExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:18049:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
    public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18053:1: ( ( ':' ) )
            // InternalOCLinEcore.g:18054:1: ( ':' )
            {
            // InternalOCLinEcore.g:18054:1: ( ':' )
            // InternalOCLinEcore.g:18055:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__1__Impl"


    // $ANTLR start "rule__PatternExpCS__Group__2"
    // InternalOCLinEcore.g:18068:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
    public final void rule__PatternExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18072:1: ( rule__PatternExpCS__Group__2__Impl )
            // InternalOCLinEcore.g:18073:2: rule__PatternExpCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PatternExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__2"


    // $ANTLR start "rule__PatternExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:18079:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
    public final void rule__PatternExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18083:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
            // InternalOCLinEcore.g:18084:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
            {
            // InternalOCLinEcore.g:18084:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
            // InternalOCLinEcore.g:18085:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
            }
            // InternalOCLinEcore.g:18086:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
            // InternalOCLinEcore.g:18086:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PatternExpCS__OwnedPatternTypeAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__Group__2__Impl"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:18102:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
    public final void rule__LambdaLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18106:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18107:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__LambdaLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__0"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:18114:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
    public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18118:1: ( ( 'Lambda' ) )
            // InternalOCLinEcore.g:18119:1: ( 'Lambda' )
            {
            // InternalOCLinEcore.g:18119:1: ( 'Lambda' )
            // InternalOCLinEcore.g:18120:1: 'Lambda'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
            }
            match(input,112,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:18133:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
    public final void rule__LambdaLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18137:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:18138:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__LambdaLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__1"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:18145:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18149:1: ( ( '{' ) )
            // InternalOCLinEcore.g:18150:1: ( '{' )
            {
            // InternalOCLinEcore.g:18150:1: ( '{' )
            // InternalOCLinEcore.g:18151:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__2"
    // InternalOCLinEcore.g:18164:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
    public final void rule__LambdaLiteralExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18168:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:18169:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__LambdaLiteralExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__2"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:18176:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
    public final void rule__LambdaLiteralExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18180:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
            // InternalOCLinEcore.g:18181:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
            {
            // InternalOCLinEcore.g:18181:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
            // InternalOCLinEcore.g:18182:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
            }
            // InternalOCLinEcore.g:18183:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
            // InternalOCLinEcore.g:18183:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__2__Impl"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__3"
    // InternalOCLinEcore.g:18193:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
    public final void rule__LambdaLiteralExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18197:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:18198:2: rule__LambdaLiteralExpCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LambdaLiteralExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__3"


    // $ANTLR start "rule__LambdaLiteralExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:18204:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18208:1: ( ( '}' ) )
            // InternalOCLinEcore.g:18209:1: ( '}' )
            {
            // InternalOCLinEcore.g:18209:1: ( '}' )
            // InternalOCLinEcore.g:18210:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__Group__3__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:18231:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
    public final void rule__MapLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18235:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18236:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__MapLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__0"


    // $ANTLR start "rule__MapLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:18243:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
    public final void rule__MapLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18247:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:18248:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:18248:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:18249:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:18250:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:18250:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__OwnedTypeAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:18260:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
    public final void rule__MapLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18264:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:18265:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_96);
            rule__MapLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__1"


    // $ANTLR start "rule__MapLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:18272:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18276:1: ( ( '{' ) )
            // InternalOCLinEcore.g:18277:1: ( '{' )
            {
            // InternalOCLinEcore.g:18277:1: ( '{' )
            // InternalOCLinEcore.g:18278:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group__2"
    // InternalOCLinEcore.g:18291:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
    public final void rule__MapLiteralExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18295:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:18296:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_96);
            rule__MapLiteralExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__2"


    // $ANTLR start "rule__MapLiteralExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:18303:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
    public final void rule__MapLiteralExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18307:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:18308:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:18308:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
            // InternalOCLinEcore.g:18309:1: ( rule__MapLiteralExpCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:18310:1: ( rule__MapLiteralExpCS__Group_2__0 )?
            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<=51)||(LA195_0>=54 && LA195_0<=64)||(LA195_0>=85 && LA195_0<=99)||LA195_0==102||LA195_0==112||(LA195_0>=114 && LA195_0<=115)||LA195_0==120||(LA195_0>=125 && LA195_0<=126)||(LA195_0>=139 && LA195_0<=140)) ) {
                alt195=1;
            }
            switch (alt195) {
                case 1 :
                    // InternalOCLinEcore.g:18310:2: rule__MapLiteralExpCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__MapLiteralExpCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__2__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group__3"
    // InternalOCLinEcore.g:18320:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
    public final void rule__MapLiteralExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18324:1: ( rule__MapLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:18325:2: rule__MapLiteralExpCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__3"


    // $ANTLR start "rule__MapLiteralExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:18331:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18335:1: ( ( '}' ) )
            // InternalOCLinEcore.g:18336:1: ( '}' )
            {
            // InternalOCLinEcore.g:18336:1: ( '}' )
            // InternalOCLinEcore.g:18337:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group__3__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2__0"
    // InternalOCLinEcore.g:18358:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
    public final void rule__MapLiteralExpCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18362:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
            // InternalOCLinEcore.g:18363:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__MapLiteralExpCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2__0"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:18370:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
    public final void rule__MapLiteralExpCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18374:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:18375:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:18375:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:18376:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:18377:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:18377:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__OwnedPartsAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2__0__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2__1"
    // InternalOCLinEcore.g:18387:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
    public final void rule__MapLiteralExpCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18391:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:18392:2: rule__MapLiteralExpCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2__1"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:18398:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
    public final void rule__MapLiteralExpCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18402:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:18403:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:18403:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:18404:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:18405:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
            loop196:
            do {
                int alt196=2;
                int LA196_0 = input.LA(1);

                if ( (LA196_0==105) ) {
                    alt196=1;
                }


                switch (alt196) {
            	case 1 :
            	    // InternalOCLinEcore.g:18405:2: rule__MapLiteralExpCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__MapLiteralExpCS__Group_2_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2__1__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0"
    // InternalOCLinEcore.g:18419:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
    public final void rule__MapLiteralExpCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18423:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
            // InternalOCLinEcore.g:18424:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__MapLiteralExpCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2_1__0"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:18431:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
    public final void rule__MapLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18435:1: ( ( ',' ) )
            // InternalOCLinEcore.g:18436:1: ( ',' )
            {
            // InternalOCLinEcore.g:18436:1: ( ',' )
            // InternalOCLinEcore.g:18437:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1"
    // InternalOCLinEcore.g:18450:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
    public final void rule__MapLiteralExpCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18454:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:18455:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2_1__1"


    // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:18461:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
    public final void rule__MapLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18465:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:18466:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:18466:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:18467:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:18468:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:18468:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__MapLiteralPartCS__Group__0"
    // InternalOCLinEcore.g:18482:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
    public final void rule__MapLiteralPartCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18486:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
            // InternalOCLinEcore.g:18487:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_97);
            rule__MapLiteralPartCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__0"


    // $ANTLR start "rule__MapLiteralPartCS__Group__0__Impl"
    // InternalOCLinEcore.g:18494:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
    public final void rule__MapLiteralPartCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18498:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
            // InternalOCLinEcore.g:18499:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
            {
            // InternalOCLinEcore.g:18499:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
            // InternalOCLinEcore.g:18500:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
            }
            // InternalOCLinEcore.g:18501:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
            // InternalOCLinEcore.g:18501:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__OwnedKeyAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__0__Impl"


    // $ANTLR start "rule__MapLiteralPartCS__Group__1"
    // InternalOCLinEcore.g:18511:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
    public final void rule__MapLiteralPartCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18515:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
            // InternalOCLinEcore.g:18516:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__MapLiteralPartCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__1"


    // $ANTLR start "rule__MapLiteralPartCS__Group__1__Impl"
    // InternalOCLinEcore.g:18523:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
    public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18527:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:18528:1: ( '<-' )
            {
            // InternalOCLinEcore.g:18528:1: ( '<-' )
            // InternalOCLinEcore.g:18529:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__1__Impl"


    // $ANTLR start "rule__MapLiteralPartCS__Group__2"
    // InternalOCLinEcore.g:18542:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
    public final void rule__MapLiteralPartCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18546:1: ( rule__MapLiteralPartCS__Group__2__Impl )
            // InternalOCLinEcore.g:18547:2: rule__MapLiteralPartCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__2"


    // $ANTLR start "rule__MapLiteralPartCS__Group__2__Impl"
    // InternalOCLinEcore.g:18553:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
    public final void rule__MapLiteralPartCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18557:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
            // InternalOCLinEcore.g:18558:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
            {
            // InternalOCLinEcore.g:18558:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
            // InternalOCLinEcore.g:18559:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
            }
            // InternalOCLinEcore.g:18560:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
            // InternalOCLinEcore.g:18560:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MapLiteralPartCS__OwnedValueAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__Group__2__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:18576:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
    public final void rule__TupleLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18580:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18581:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__TupleLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__0"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:18588:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
    public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18592:1: ( ( 'Tuple' ) )
            // InternalOCLinEcore.g:18593:1: ( 'Tuple' )
            {
            // InternalOCLinEcore.g:18593:1: ( 'Tuple' )
            // InternalOCLinEcore.g:18594:1: 'Tuple'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
            }
            match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:18607:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
    public final void rule__TupleLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18611:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:18612:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TupleLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__1"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:18619:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18623:1: ( ( '{' ) )
            // InternalOCLinEcore.g:18624:1: ( '{' )
            {
            // InternalOCLinEcore.g:18624:1: ( '{' )
            // InternalOCLinEcore.g:18625:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__2"
    // InternalOCLinEcore.g:18638:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
    public final void rule__TupleLiteralExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18642:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:18643:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_98);
            rule__TupleLiteralExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__2"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:18650:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
    public final void rule__TupleLiteralExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18654:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
            // InternalOCLinEcore.g:18655:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
            {
            // InternalOCLinEcore.g:18655:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
            // InternalOCLinEcore.g:18656:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
            }
            // InternalOCLinEcore.g:18657:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
            // InternalOCLinEcore.g:18657:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__OwnedPartsAssignment_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__2__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__3"
    // InternalOCLinEcore.g:18667:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
    public final void rule__TupleLiteralExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18671:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
            // InternalOCLinEcore.g:18672:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_98);
            rule__TupleLiteralExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__3"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:18679:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
    public final void rule__TupleLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18683:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
            // InternalOCLinEcore.g:18684:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
            {
            // InternalOCLinEcore.g:18684:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
            // InternalOCLinEcore.g:18685:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:18686:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
            loop197:
            do {
                int alt197=2;
                int LA197_0 = input.LA(1);

                if ( (LA197_0==105) ) {
                    alt197=1;
                }


                switch (alt197) {
            	case 1 :
            	    // InternalOCLinEcore.g:18686:2: rule__TupleLiteralExpCS__Group_3__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TupleLiteralExpCS__Group_3__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__3__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__4"
    // InternalOCLinEcore.g:18696:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
    public final void rule__TupleLiteralExpCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18700:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:18701:2: rule__TupleLiteralExpCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__4"


    // $ANTLR start "rule__TupleLiteralExpCS__Group__4__Impl"
    // InternalOCLinEcore.g:18707:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
    public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18711:1: ( ( '}' ) )
            // InternalOCLinEcore.g:18712:1: ( '}' )
            {
            // InternalOCLinEcore.g:18712:1: ( '}' )
            // InternalOCLinEcore.g:18713:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group__4__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0"
    // InternalOCLinEcore.g:18736:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
    public final void rule__TupleLiteralExpCS__Group_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18740:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
            // InternalOCLinEcore.g:18741:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__TupleLiteralExpCS__Group_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group_3__0"


    // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0__Impl"
    // InternalOCLinEcore.g:18748:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
    public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18752:1: ( ( ',' ) )
            // InternalOCLinEcore.g:18753:1: ( ',' )
            {
            // InternalOCLinEcore.g:18753:1: ( ',' )
            // InternalOCLinEcore.g:18754:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group_3__0__Impl"


    // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1"
    // InternalOCLinEcore.g:18767:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
    public final void rule__TupleLiteralExpCS__Group_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18771:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:18772:2: rule__TupleLiteralExpCS__Group_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__Group_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group_3__1"


    // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1__Impl"
    // InternalOCLinEcore.g:18778:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
    public final void rule__TupleLiteralExpCS__Group_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18782:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:18783:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:18783:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
            // InternalOCLinEcore.g:18784:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
            }
            // InternalOCLinEcore.g:18785:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
            // InternalOCLinEcore.g:18785:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__Group_3__1__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__0"
    // InternalOCLinEcore.g:18799:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
    public final void rule__TupleLiteralPartCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18803:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
            // InternalOCLinEcore.g:18804:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_99);
            rule__TupleLiteralPartCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__0"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__0__Impl"
    // InternalOCLinEcore.g:18811:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
    public final void rule__TupleLiteralPartCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18815:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:18816:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:18816:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:18817:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:18818:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
            // InternalOCLinEcore.g:18818:2: rule__TupleLiteralPartCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__0__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__1"
    // InternalOCLinEcore.g:18828:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
    public final void rule__TupleLiteralPartCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18832:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
            // InternalOCLinEcore.g:18833:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_99);
            rule__TupleLiteralPartCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__1"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__1__Impl"
    // InternalOCLinEcore.g:18840:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
    public final void rule__TupleLiteralPartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18844:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:18845:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:18845:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
            // InternalOCLinEcore.g:18846:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:18847:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
            int alt198=2;
            int LA198_0 = input.LA(1);

            if ( (LA198_0==104) ) {
                alt198=1;
            }
            switch (alt198) {
                case 1 :
                    // InternalOCLinEcore.g:18847:2: rule__TupleLiteralPartCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TupleLiteralPartCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__1__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__2"
    // InternalOCLinEcore.g:18857:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
    public final void rule__TupleLiteralPartCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18861:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
            // InternalOCLinEcore.g:18862:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__TupleLiteralPartCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__2"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__2__Impl"
    // InternalOCLinEcore.g:18869:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
    public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18873:1: ( ( '=' ) )
            // InternalOCLinEcore.g:18874:1: ( '=' )
            {
            // InternalOCLinEcore.g:18874:1: ( '=' )
            // InternalOCLinEcore.g:18875:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__2__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__3"
    // InternalOCLinEcore.g:18888:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
    public final void rule__TupleLiteralPartCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18892:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
            // InternalOCLinEcore.g:18893:2: rule__TupleLiteralPartCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__3"


    // $ANTLR start "rule__TupleLiteralPartCS__Group__3__Impl"
    // InternalOCLinEcore.g:18899:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
    public final void rule__TupleLiteralPartCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18903:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:18904:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:18904:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:18905:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:18906:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
            // InternalOCLinEcore.g:18906:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group__3__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0"
    // InternalOCLinEcore.g:18924:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
    public final void rule__TupleLiteralPartCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18928:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
            // InternalOCLinEcore.g:18929:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__TupleLiteralPartCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group_1__0"


    // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:18936:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18940:1: ( ( ':' ) )
            // InternalOCLinEcore.g:18941:1: ( ':' )
            {
            // InternalOCLinEcore.g:18941:1: ( ':' )
            // InternalOCLinEcore.g:18942:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group_1__0__Impl"


    // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1"
    // InternalOCLinEcore.g:18955:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
    public final void rule__TupleLiteralPartCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18959:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:18960:2: rule__TupleLiteralPartCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group_1__1"


    // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:18966:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
    public final void rule__TupleLiteralPartCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18970:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:18971:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:18971:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:18972:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:18973:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:18973:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__Group_1__1__Impl"


    // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:18987:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18991:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18992:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_100);
            rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__UnlimitedNaturalLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UnlimitedNaturalLiteralExpCS__Group__0"


    // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:18999:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19003:1: ( ( () ) )
            // InternalOCLinEcore.g:19004:1: ( () )
            {
            // InternalOCLinEcore.g:19004:1: ( () )
            // InternalOCLinEcore.g:19005:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:19006:1: ()
            // InternalOCLinEcore.g:19008:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:19018:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19022:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:19023:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UnlimitedNaturalLiteralExpCS__Group__1"


    // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19029:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19033:1: ( ( '*' ) )
            // InternalOCLinEcore.g:19034:1: ( '*' )
            {
            // InternalOCLinEcore.g:19034:1: ( '*' )
            // InternalOCLinEcore.g:19035:1: '*'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
            }
            match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__InvalidLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:19052:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
    public final void rule__InvalidLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19056:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:19057:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_101);
            rule__InvalidLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvalidLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvalidLiteralExpCS__Group__0"


    // $ANTLR start "rule__InvalidLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:19064:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19068:1: ( ( () ) )
            // InternalOCLinEcore.g:19069:1: ( () )
            {
            // InternalOCLinEcore.g:19069:1: ( () )
            // InternalOCLinEcore.g:19070:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:19071:1: ()
            // InternalOCLinEcore.g:19073:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvalidLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__InvalidLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:19083:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
    public final void rule__InvalidLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19087:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:19088:2: rule__InvalidLiteralExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__InvalidLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvalidLiteralExpCS__Group__1"


    // $ANTLR start "rule__InvalidLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19094:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
    public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19098:1: ( ( 'invalid' ) )
            // InternalOCLinEcore.g:19099:1: ( 'invalid' )
            {
            // InternalOCLinEcore.g:19099:1: ( 'invalid' )
            // InternalOCLinEcore.g:19100:1: 'invalid'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
            }
            match(input,114,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvalidLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__NullLiteralExpCS__Group__0"
    // InternalOCLinEcore.g:19117:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
    public final void rule__NullLiteralExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19121:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:19122:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_102);
            rule__NullLiteralExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NullLiteralExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NullLiteralExpCS__Group__0"


    // $ANTLR start "rule__NullLiteralExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:19129:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19133:1: ( ( () ) )
            // InternalOCLinEcore.g:19134:1: ( () )
            {
            // InternalOCLinEcore.g:19134:1: ( () )
            // InternalOCLinEcore.g:19135:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:19136:1: ()
            // InternalOCLinEcore.g:19138:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NullLiteralExpCS__Group__0__Impl"


    // $ANTLR start "rule__NullLiteralExpCS__Group__1"
    // InternalOCLinEcore.g:19148:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
    public final void rule__NullLiteralExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19152:1: ( rule__NullLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:19153:2: rule__NullLiteralExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NullLiteralExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NullLiteralExpCS__Group__1"


    // $ANTLR start "rule__NullLiteralExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19159:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
    public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19163:1: ( ( 'null' ) )
            // InternalOCLinEcore.g:19164:1: ( 'null' )
            {
            // InternalOCLinEcore.g:19164:1: ( 'null' )
            // InternalOCLinEcore.g:19165:1: 'null'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
            }
            match(input,115,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NullLiteralExpCS__Group__1__Impl"


    // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0"
    // InternalOCLinEcore.g:19182:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
    public final void rule__TypeLiteralWithMultiplicityCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19186:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
            // InternalOCLinEcore.g:19187:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_81);
            rule__TypeLiteralWithMultiplicityCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeLiteralWithMultiplicityCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralWithMultiplicityCS__Group__0"


    // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"
    // InternalOCLinEcore.g:19194:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
    public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19198:1: ( ( ruleTypeLiteralCS ) )
            // InternalOCLinEcore.g:19199:1: ( ruleTypeLiteralCS )
            {
            // InternalOCLinEcore.g:19199:1: ( ruleTypeLiteralCS )
            // InternalOCLinEcore.g:19200:1: ruleTypeLiteralCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeLiteralCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"


    // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1"
    // InternalOCLinEcore.g:19211:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
    public final void rule__TypeLiteralWithMultiplicityCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19215:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
            // InternalOCLinEcore.g:19216:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeLiteralWithMultiplicityCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralWithMultiplicityCS__Group__1"


    // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"
    // InternalOCLinEcore.g:19222:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
    public final void rule__TypeLiteralWithMultiplicityCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19226:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:19227:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:19227:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:19228:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:19229:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
            int alt199=2;
            int LA199_0 = input.LA(1);

            if ( (LA199_0==117) ) {
                alt199=1;
            }
            switch (alt199) {
                case 1 :
                    // InternalOCLinEcore.g:19229:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group__0"
    // InternalOCLinEcore.g:19243:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
    public final void rule__TypeNameExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19247:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
            // InternalOCLinEcore.g:19248:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__TypeNameExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group__0"


    // $ANTLR start "rule__TypeNameExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:19255:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
    public final void rule__TypeNameExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19259:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:19260:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:19260:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:19261:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:19262:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:19262:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__OwnedPathNameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group__0__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group__1"
    // InternalOCLinEcore.g:19272:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
    public final void rule__TypeNameExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19276:1: ( rule__TypeNameExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:19277:2: rule__TypeNameExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group__1"


    // $ANTLR start "rule__TypeNameExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19283:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
    public final void rule__TypeNameExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19287:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:19288:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:19288:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
            // InternalOCLinEcore.g:19289:1: ( rule__TypeNameExpCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:19290:1: ( rule__TypeNameExpCS__Group_1__0 )?
            int alt200=2;
            int LA200_0 = input.LA(1);

            if ( (LA200_0==106) ) {
                alt200=1;
            }
            switch (alt200) {
                case 1 :
                    // InternalOCLinEcore.g:19290:2: rule__TypeNameExpCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypeNameExpCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group__1__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group_1__0"
    // InternalOCLinEcore.g:19304:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
    public final void rule__TypeNameExpCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19308:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
            // InternalOCLinEcore.g:19309:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__TypeNameExpCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1__0"


    // $ANTLR start "rule__TypeNameExpCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:19316:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
    public final void rule__TypeNameExpCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19320:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:19321:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:19321:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
            // InternalOCLinEcore.g:19322:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
            }
            // InternalOCLinEcore.g:19323:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
            // InternalOCLinEcore.g:19323:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1__0__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group_1__1"
    // InternalOCLinEcore.g:19333:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
    public final void rule__TypeNameExpCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19337:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:19338:2: rule__TypeNameExpCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1__1"


    // $ANTLR start "rule__TypeNameExpCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:19344:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
    public final void rule__TypeNameExpCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19348:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:19349:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:19349:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:19350:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:19351:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
            int alt201=2;
            int LA201_0 = input.LA(1);

            if ( (LA201_0==106) ) {
                alt201=1;
            }
            switch (alt201) {
                case 1 :
                    // InternalOCLinEcore.g:19351:2: rule__TypeNameExpCS__Group_1_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypeNameExpCS__Group_1_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1__1__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0"
    // InternalOCLinEcore.g:19365:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
    public final void rule__TypeNameExpCS__Group_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19369:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
            // InternalOCLinEcore.g:19370:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__TypeNameExpCS__Group_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__0"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0__Impl"
    // InternalOCLinEcore.g:19377:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
    public final void rule__TypeNameExpCS__Group_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19381:1: ( ( '{' ) )
            // InternalOCLinEcore.g:19382:1: ( '{' )
            {
            // InternalOCLinEcore.g:19382:1: ( '{' )
            // InternalOCLinEcore.g:19383:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__0__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1"
    // InternalOCLinEcore.g:19396:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
    public final void rule__TypeNameExpCS__Group_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19400:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
            // InternalOCLinEcore.g:19401:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_22);
            rule__TypeNameExpCS__Group_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__1"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1__Impl"
    // InternalOCLinEcore.g:19408:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
    public final void rule__TypeNameExpCS__Group_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19412:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:19413:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:19413:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:19414:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:19415:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
            // InternalOCLinEcore.g:19415:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__1__Impl"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2"
    // InternalOCLinEcore.g:19425:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
    public final void rule__TypeNameExpCS__Group_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19429:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:19430:2: rule__TypeNameExpCS__Group_1_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeNameExpCS__Group_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__2"


    // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2__Impl"
    // InternalOCLinEcore.g:19436:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
    public final void rule__TypeNameExpCS__Group_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19440:1: ( ( '}' ) )
            // InternalOCLinEcore.g:19441:1: ( '}' )
            {
            // InternalOCLinEcore.g:19441:1: ( '}' )
            // InternalOCLinEcore.g:19442:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__Group_1_1__2__Impl"


    // $ANTLR start "rule__TypeExpCS__Group__0"
    // InternalOCLinEcore.g:19461:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
    public final void rule__TypeExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19465:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
            // InternalOCLinEcore.g:19466:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_81);
            rule__TypeExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpCS__Group__0"


    // $ANTLR start "rule__TypeExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:19473:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
    public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19477:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
            // InternalOCLinEcore.g:19478:1: ( ruleTypeExpWithoutMultiplicityCS )
            {
            // InternalOCLinEcore.g:19478:1: ( ruleTypeExpWithoutMultiplicityCS )
            // InternalOCLinEcore.g:19479:1: ruleTypeExpWithoutMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpWithoutMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpCS__Group__0__Impl"


    // $ANTLR start "rule__TypeExpCS__Group__1"
    // InternalOCLinEcore.g:19490:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
    public final void rule__TypeExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19494:1: ( rule__TypeExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:19495:2: rule__TypeExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpCS__Group__1"


    // $ANTLR start "rule__TypeExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19501:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
    public final void rule__TypeExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19505:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:19506:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:19506:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:19507:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:19508:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
            int alt202=2;
            int LA202_0 = input.LA(1);

            if ( (LA202_0==117) ) {
                alt202=1;
            }
            switch (alt202) {
                case 1 :
                    // InternalOCLinEcore.g:19508:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypeExpCS__OwnedMultiplicityAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpCS__Group__1__Impl"


    // $ANTLR start "rule__ExpCS__Group_0__0"
    // InternalOCLinEcore.g:19522:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
    public final void rule__ExpCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19526:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
            // InternalOCLinEcore.g:19527:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_103);
            rule__ExpCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0__0"


    // $ANTLR start "rule__ExpCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:19534:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
    public final void rule__ExpCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19538:1: ( ( rulePrefixedPrimaryExpCS ) )
            // InternalOCLinEcore.g:19539:1: ( rulePrefixedPrimaryExpCS )
            {
            // InternalOCLinEcore.g:19539:1: ( rulePrefixedPrimaryExpCS )
            // InternalOCLinEcore.g:19540:1: rulePrefixedPrimaryExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePrefixedPrimaryExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0__0__Impl"


    // $ANTLR start "rule__ExpCS__Group_0__1"
    // InternalOCLinEcore.g:19551:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
    public final void rule__ExpCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19555:1: ( rule__ExpCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:19556:2: rule__ExpCS__Group_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0__1"


    // $ANTLR start "rule__ExpCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:19562:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
    public final void rule__ExpCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19566:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
            // InternalOCLinEcore.g:19567:1: ( ( rule__ExpCS__Group_0_1__0 )? )
            {
            // InternalOCLinEcore.g:19567:1: ( ( rule__ExpCS__Group_0_1__0 )? )
            // InternalOCLinEcore.g:19568:1: ( rule__ExpCS__Group_0_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getGroup_0_1());
            }
            // InternalOCLinEcore.g:19569:1: ( rule__ExpCS__Group_0_1__0 )?
            int alt203=2;
            int LA203_0 = input.LA(1);

            if ( (LA203_0==61||(LA203_0>=64 && LA203_0<=84)) ) {
                alt203=1;
            }
            switch (alt203) {
                case 1 :
                    // InternalOCLinEcore.g:19569:2: rule__ExpCS__Group_0_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__ExpCS__Group_0_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getGroup_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0__1__Impl"


    // $ANTLR start "rule__ExpCS__Group_0_1__0"
    // InternalOCLinEcore.g:19583:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
    public final void rule__ExpCS__Group_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19587:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
            // InternalOCLinEcore.g:19588:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_103);
            rule__ExpCS__Group_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Group_0_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__0"


    // $ANTLR start "rule__ExpCS__Group_0_1__0__Impl"
    // InternalOCLinEcore.g:19595:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
    public final void rule__ExpCS__Group_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19599:1: ( ( () ) )
            // InternalOCLinEcore.g:19600:1: ( () )
            {
            // InternalOCLinEcore.g:19600:1: ( () )
            // InternalOCLinEcore.g:19601:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
            }
            // InternalOCLinEcore.g:19602:1: ()
            // InternalOCLinEcore.g:19604:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__0__Impl"


    // $ANTLR start "rule__ExpCS__Group_0_1__1"
    // InternalOCLinEcore.g:19614:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
    public final void rule__ExpCS__Group_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19618:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
            // InternalOCLinEcore.g:19619:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__ExpCS__Group_0_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Group_0_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__1"


    // $ANTLR start "rule__ExpCS__Group_0_1__1__Impl"
    // InternalOCLinEcore.g:19626:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
    public final void rule__ExpCS__Group_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19630:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
            // InternalOCLinEcore.g:19631:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
            {
            // InternalOCLinEcore.g:19631:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
            // InternalOCLinEcore.g:19632:1: ( rule__ExpCS__NameAssignment_0_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:19633:1: ( rule__ExpCS__NameAssignment_0_1_1 )
            // InternalOCLinEcore.g:19633:2: rule__ExpCS__NameAssignment_0_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__NameAssignment_0_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__1__Impl"


    // $ANTLR start "rule__ExpCS__Group_0_1__2"
    // InternalOCLinEcore.g:19643:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
    public final void rule__ExpCS__Group_0_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19647:1: ( rule__ExpCS__Group_0_1__2__Impl )
            // InternalOCLinEcore.g:19648:2: rule__ExpCS__Group_0_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__Group_0_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__2"


    // $ANTLR start "rule__ExpCS__Group_0_1__2__Impl"
    // InternalOCLinEcore.g:19654:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
    public final void rule__ExpCS__Group_0_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19658:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
            // InternalOCLinEcore.g:19659:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
            {
            // InternalOCLinEcore.g:19659:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
            // InternalOCLinEcore.g:19660:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
            }
            // InternalOCLinEcore.g:19661:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
            // InternalOCLinEcore.g:19661:2: rule__ExpCS__OwnedRightAssignment_0_1_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ExpCS__OwnedRightAssignment_0_1_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__Group_0_1__2__Impl"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0"
    // InternalOCLinEcore.g:19677:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
    public final void rule__PrefixedLetExpCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19681:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
            // InternalOCLinEcore.g:19682:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_104);
            rule__PrefixedLetExpCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__0"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:19689:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
    public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19693:1: ( ( () ) )
            // InternalOCLinEcore.g:19694:1: ( () )
            {
            // InternalOCLinEcore.g:19694:1: ( () )
            // InternalOCLinEcore.g:19695:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
            }
            // InternalOCLinEcore.g:19696:1: ()
            // InternalOCLinEcore.g:19698:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__0__Impl"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1"
    // InternalOCLinEcore.g:19708:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
    public final void rule__PrefixedLetExpCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19712:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
            // InternalOCLinEcore.g:19713:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__PrefixedLetExpCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__Group_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__1"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:19720:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
    public final void rule__PrefixedLetExpCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19724:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:19725:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:19725:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
            // InternalOCLinEcore.g:19726:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
            }
            // InternalOCLinEcore.g:19727:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
            // InternalOCLinEcore.g:19727:2: rule__PrefixedLetExpCS__NameAssignment_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__NameAssignment_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__1__Impl"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2"
    // InternalOCLinEcore.g:19737:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
    public final void rule__PrefixedLetExpCS__Group_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19741:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
            // InternalOCLinEcore.g:19742:2: rule__PrefixedLetExpCS__Group_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__Group_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__2"


    // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2__Impl"
    // InternalOCLinEcore.g:19748:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
    public final void rule__PrefixedLetExpCS__Group_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19752:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
            // InternalOCLinEcore.g:19753:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
            {
            // InternalOCLinEcore.g:19753:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
            // InternalOCLinEcore.g:19754:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
            }
            // InternalOCLinEcore.g:19755:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
            // InternalOCLinEcore.g:19755:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedLetExpCS__OwnedRightAssignment_0_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__Group_0__2__Impl"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0"
    // InternalOCLinEcore.g:19771:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19775:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
            // InternalOCLinEcore.g:19776:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_104);
            rule__PrefixedPrimaryExpCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__0"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:19783:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19787:1: ( ( () ) )
            // InternalOCLinEcore.g:19788:1: ( () )
            {
            // InternalOCLinEcore.g:19788:1: ( () )
            // InternalOCLinEcore.g:19789:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
            }
            // InternalOCLinEcore.g:19790:1: ()
            // InternalOCLinEcore.g:19792:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1"
    // InternalOCLinEcore.g:19802:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19806:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
            // InternalOCLinEcore.g:19807:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__PrefixedPrimaryExpCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__Group_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__1"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:19814:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19818:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:19819:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:19819:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
            // InternalOCLinEcore.g:19820:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
            }
            // InternalOCLinEcore.g:19821:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
            // InternalOCLinEcore.g:19821:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__NameAssignment_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2"
    // InternalOCLinEcore.g:19831:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19835:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
            // InternalOCLinEcore.g:19836:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__Group_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__2"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"
    // InternalOCLinEcore.g:19842:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19846:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
            // InternalOCLinEcore.g:19847:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
            {
            // InternalOCLinEcore.g:19847:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
            // InternalOCLinEcore.g:19848:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
            }
            // InternalOCLinEcore.g:19849:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
            // InternalOCLinEcore.g:19849:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"


    // $ANTLR start "rule__NameExpCS__Group__0"
    // InternalOCLinEcore.g:19865:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
    public final void rule__NameExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19869:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
            // InternalOCLinEcore.g:19870:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_105);
            rule__NameExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__0"


    // $ANTLR start "rule__NameExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:19877:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
    public final void rule__NameExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19881:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:19882:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:19882:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:19883:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:19884:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:19884:2: rule__NameExpCS__OwnedPathNameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__OwnedPathNameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__0__Impl"


    // $ANTLR start "rule__NameExpCS__Group__1"
    // InternalOCLinEcore.g:19894:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
    public final void rule__NameExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19898:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
            // InternalOCLinEcore.g:19899:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_105);
            rule__NameExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__1"


    // $ANTLR start "rule__NameExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:19906:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
    public final void rule__NameExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19910:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
            // InternalOCLinEcore.g:19911:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
            {
            // InternalOCLinEcore.g:19911:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
            // InternalOCLinEcore.g:19912:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
            }
            // InternalOCLinEcore.g:19913:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
            loop204:
            do {
                int alt204=2;
                int LA204_0 = input.LA(1);

                if ( (LA204_0==117) ) {
                    alt204=1;
                }


                switch (alt204) {
            	case 1 :
            	    // InternalOCLinEcore.g:19913:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_106);
            	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__1__Impl"


    // $ANTLR start "rule__NameExpCS__Group__2"
    // InternalOCLinEcore.g:19923:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
    public final void rule__NameExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19927:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
            // InternalOCLinEcore.g:19928:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_105);
            rule__NameExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__2"


    // $ANTLR start "rule__NameExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:19935:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
    public final void rule__NameExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19939:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
            // InternalOCLinEcore.g:19940:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
            {
            // InternalOCLinEcore.g:19940:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
            // InternalOCLinEcore.g:19941:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
            }
            // InternalOCLinEcore.g:19942:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==102) ) {
                alt205=1;
            }
            switch (alt205) {
                case 1 :
                    // InternalOCLinEcore.g:19942:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__2__Impl"


    // $ANTLR start "rule__NameExpCS__Group__3"
    // InternalOCLinEcore.g:19952:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
    public final void rule__NameExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19956:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
            // InternalOCLinEcore.g:19957:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_105);
            rule__NameExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__3"


    // $ANTLR start "rule__NameExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:19964:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
    public final void rule__NameExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19968:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
            // InternalOCLinEcore.g:19969:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
            {
            // InternalOCLinEcore.g:19969:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
            // InternalOCLinEcore.g:19970:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
            }
            // InternalOCLinEcore.g:19971:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
            int alt206=2;
            int LA206_0 = input.LA(1);

            if ( (LA206_0==106) ) {
                alt206=1;
            }
            switch (alt206) {
                case 1 :
                    // InternalOCLinEcore.g:19971:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__3__Impl"


    // $ANTLR start "rule__NameExpCS__Group__4"
    // InternalOCLinEcore.g:19981:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
    public final void rule__NameExpCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19985:1: ( rule__NameExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:19986:2: rule__NameExpCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__4"


    // $ANTLR start "rule__NameExpCS__Group__4__Impl"
    // InternalOCLinEcore.g:19992:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
    public final void rule__NameExpCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19996:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:19997:1: ( ( rule__NameExpCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:19997:1: ( ( rule__NameExpCS__Group_4__0 )? )
            // InternalOCLinEcore.g:19998:1: ( rule__NameExpCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:19999:1: ( rule__NameExpCS__Group_4__0 )?
            int alt207=2;
            int LA207_0 = input.LA(1);

            if ( (LA207_0==141) ) {
                alt207=1;
            }
            switch (alt207) {
                case 1 :
                    // InternalOCLinEcore.g:19999:2: rule__NameExpCS__Group_4__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NameExpCS__Group_4__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getGroup_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group__4__Impl"


    // $ANTLR start "rule__NameExpCS__Group_4__0"
    // InternalOCLinEcore.g:20019:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
    public final void rule__NameExpCS__Group_4__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20023:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
            // InternalOCLinEcore.g:20024:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
            {
            pushFollow(FollowSets000.FOLLOW_107);
            rule__NameExpCS__Group_4__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group_4__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group_4__0"


    // $ANTLR start "rule__NameExpCS__Group_4__0__Impl"
    // InternalOCLinEcore.g:20031:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
    public final void rule__NameExpCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20035:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
            // InternalOCLinEcore.g:20036:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
            {
            // InternalOCLinEcore.g:20036:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
            // InternalOCLinEcore.g:20037:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
            }
            // InternalOCLinEcore.g:20038:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
            // InternalOCLinEcore.g:20038:2: rule__NameExpCS__IsPreAssignment_4_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__IsPreAssignment_4_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group_4__0__Impl"


    // $ANTLR start "rule__NameExpCS__Group_4__1"
    // InternalOCLinEcore.g:20048:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
    public final void rule__NameExpCS__Group_4__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20052:1: ( rule__NameExpCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:20053:2: rule__NameExpCS__Group_4__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NameExpCS__Group_4__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group_4__1"


    // $ANTLR start "rule__NameExpCS__Group_4__1__Impl"
    // InternalOCLinEcore.g:20059:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
    public final void rule__NameExpCS__Group_4__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20063:1: ( ( 'pre' ) )
            // InternalOCLinEcore.g:20064:1: ( 'pre' )
            {
            // InternalOCLinEcore.g:20064:1: ( 'pre' )
            // InternalOCLinEcore.g:20065:1: 'pre'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
            }
            match(input,116,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__Group_4__1__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0"
    // InternalOCLinEcore.g:20082:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
    public final void rule__CurlyBracketedClauseCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20086:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:20087:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__CurlyBracketedClauseCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0__Impl"
    // InternalOCLinEcore.g:20094:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
    public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20098:1: ( ( () ) )
            // InternalOCLinEcore.g:20099:1: ( () )
            {
            // InternalOCLinEcore.g:20099:1: ( () )
            // InternalOCLinEcore.g:20100:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
            }
            // InternalOCLinEcore.g:20101:1: ()
            // InternalOCLinEcore.g:20103:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__0__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1"
    // InternalOCLinEcore.g:20113:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
    public final void rule__CurlyBracketedClauseCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20117:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:20118:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_79);
            rule__CurlyBracketedClauseCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__1"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1__Impl"
    // InternalOCLinEcore.g:20125:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20129:1: ( ( '{' ) )
            // InternalOCLinEcore.g:20130:1: ( '{' )
            {
            // InternalOCLinEcore.g:20130:1: ( '{' )
            // InternalOCLinEcore.g:20131:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__1__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2"
    // InternalOCLinEcore.g:20144:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
    public final void rule__CurlyBracketedClauseCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20148:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:20149:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_79);
            rule__CurlyBracketedClauseCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__2"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2__Impl"
    // InternalOCLinEcore.g:20156:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
    public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20160:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:20161:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:20161:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
            // InternalOCLinEcore.g:20162:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:20163:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
            int alt208=2;
            int LA208_0 = input.LA(1);

            if ( (LA208_0==RULE_SINGLE_QUOTED_STRING||(LA208_0>=RULE_SIMPLE_ID && LA208_0<=RULE_ESCAPED_ID)||(LA208_0>=17 && LA208_0<=51)||(LA208_0>=54 && LA208_0<=60)) ) {
                alt208=1;
            }
            switch (alt208) {
                case 1 :
                    // InternalOCLinEcore.g:20163:2: rule__CurlyBracketedClauseCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CurlyBracketedClauseCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__2__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3"
    // InternalOCLinEcore.g:20173:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
    public final void rule__CurlyBracketedClauseCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20177:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:20178:2: rule__CurlyBracketedClauseCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__3"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3__Impl"
    // InternalOCLinEcore.g:20184:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20188:1: ( ( '}' ) )
            // InternalOCLinEcore.g:20189:1: ( '}' )
            {
            // InternalOCLinEcore.g:20189:1: ( '}' )
            // InternalOCLinEcore.g:20190:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group__3__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0"
    // InternalOCLinEcore.g:20211:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
    public final void rule__CurlyBracketedClauseCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20215:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
            // InternalOCLinEcore.g:20216:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__CurlyBracketedClauseCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2__0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:20223:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20227:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:20228:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:20228:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:20229:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:20230:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:20230:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2__0__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1"
    // InternalOCLinEcore.g:20240:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
    public final void rule__CurlyBracketedClauseCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20244:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:20245:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2__1"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:20251:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20255:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:20256:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:20256:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:20257:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:20258:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
            loop209:
            do {
                int alt209=2;
                int LA209_0 = input.LA(1);

                if ( (LA209_0==105) ) {
                    alt209=1;
                }


                switch (alt209) {
            	case 1 :
            	    // InternalOCLinEcore.g:20258:2: rule__CurlyBracketedClauseCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__CurlyBracketedClauseCS__Group_2_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2__1__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0"
    // InternalOCLinEcore.g:20272:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
    public final void rule__CurlyBracketedClauseCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20276:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
            // InternalOCLinEcore.g:20277:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_18);
            rule__CurlyBracketedClauseCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2_1__0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:20284:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20288:1: ( ( ',' ) )
            // InternalOCLinEcore.g:20289:1: ( ',' )
            {
            // InternalOCLinEcore.g:20289:1: ( ',' )
            // InternalOCLinEcore.g:20290:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1"
    // InternalOCLinEcore.g:20303:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
    public final void rule__CurlyBracketedClauseCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20307:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:20308:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2_1__1"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:20314:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20318:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:20319:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:20319:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:20320:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:20321:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:20321:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
    // InternalOCLinEcore.g:20335:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
    public final void rule__RoundBracketedClauseCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20339:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:20340:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_11);
            rule__RoundBracketedClauseCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__0"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__0__Impl"
    // InternalOCLinEcore.g:20347:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
    public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20351:1: ( ( () ) )
            // InternalOCLinEcore.g:20352:1: ( () )
            {
            // InternalOCLinEcore.g:20352:1: ( () )
            // InternalOCLinEcore.g:20353:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
            }
            // InternalOCLinEcore.g:20354:1: ()
            // InternalOCLinEcore.g:20356:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__0__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__1"
    // InternalOCLinEcore.g:20366:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
    public final void rule__RoundBracketedClauseCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20370:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:20371:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_108);
            rule__RoundBracketedClauseCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__1"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__1__Impl"
    // InternalOCLinEcore.g:20378:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
    public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20382:1: ( ( '(' ) )
            // InternalOCLinEcore.g:20383:1: ( '(' )
            {
            // InternalOCLinEcore.g:20383:1: ( '(' )
            // InternalOCLinEcore.g:20384:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__1__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__2"
    // InternalOCLinEcore.g:20397:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
    public final void rule__RoundBracketedClauseCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20401:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:20402:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_108);
            rule__RoundBracketedClauseCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__2"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__2__Impl"
    // InternalOCLinEcore.g:20409:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
    public final void rule__RoundBracketedClauseCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20413:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:20414:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:20414:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
            // InternalOCLinEcore.g:20415:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:20416:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( ((LA210_0>=RULE_INT && LA210_0<=RULE_SINGLE_QUOTED_STRING)||(LA210_0>=RULE_SIMPLE_ID && LA210_0<=RULE_ESCAPED_ID)||(LA210_0>=17 && LA210_0<=51)||(LA210_0>=54 && LA210_0<=64)||(LA210_0>=85 && LA210_0<=99)||LA210_0==102||LA210_0==104||LA210_0==112||(LA210_0>=114 && LA210_0<=115)||LA210_0==120||(LA210_0>=125 && LA210_0<=126)||(LA210_0>=139 && LA210_0<=140)) ) {
                alt210=1;
            }
            switch (alt210) {
                case 1 :
                    // InternalOCLinEcore.g:20416:2: rule__RoundBracketedClauseCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__RoundBracketedClauseCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__2__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__3"
    // InternalOCLinEcore.g:20426:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
    public final void rule__RoundBracketedClauseCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20430:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:20431:2: rule__RoundBracketedClauseCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__3"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__3__Impl"
    // InternalOCLinEcore.g:20437:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
    public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20441:1: ( ( ')' ) )
            // InternalOCLinEcore.g:20442:1: ( ')' )
            {
            // InternalOCLinEcore.g:20442:1: ( ')' )
            // InternalOCLinEcore.g:20443:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group__3__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0"
    // InternalOCLinEcore.g:20464:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
    public final void rule__RoundBracketedClauseCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20468:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
            // InternalOCLinEcore.g:20469:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_109);
            rule__RoundBracketedClauseCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group_2__0"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:20476:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
    public final void rule__RoundBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20480:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:20481:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:20481:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
            // InternalOCLinEcore.g:20482:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
            }
            // InternalOCLinEcore.g:20483:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
            // InternalOCLinEcore.g:20483:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group_2__0__Impl"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1"
    // InternalOCLinEcore.g:20493:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
    public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20497:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:20498:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group_2__1"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:20504:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
    public final void rule__RoundBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20508:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
            // InternalOCLinEcore.g:20509:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
            {
            // InternalOCLinEcore.g:20509:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
            // InternalOCLinEcore.g:20510:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
            }
            // InternalOCLinEcore.g:20511:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
            loop211:
            do {
                int alt211=2;
                int LA211_0 = input.LA(1);

                if ( (LA211_0==52||LA211_0==105||LA211_0==142) ) {
                    alt211=1;
                }


                switch (alt211) {
            	case 1 :
            	    // InternalOCLinEcore.g:20511:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_110);
            	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__Group_2__1__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
    // InternalOCLinEcore.g:20525:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
    public final void rule__SquareBracketedClauseCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20529:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:20530:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__SquareBracketedClauseCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__0"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__0__Impl"
    // InternalOCLinEcore.g:20537:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
    public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20541:1: ( ( '[' ) )
            // InternalOCLinEcore.g:20542:1: ( '[' )
            {
            // InternalOCLinEcore.g:20542:1: ( '[' )
            // InternalOCLinEcore.g:20543:1: '['
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
            }
            match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__0__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__1"
    // InternalOCLinEcore.g:20556:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
    public final void rule__SquareBracketedClauseCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20560:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:20561:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_111);
            rule__SquareBracketedClauseCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__1"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__1__Impl"
    // InternalOCLinEcore.g:20568:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
    public final void rule__SquareBracketedClauseCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20572:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
            // InternalOCLinEcore.g:20573:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
            {
            // InternalOCLinEcore.g:20573:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
            // InternalOCLinEcore.g:20574:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
            }
            // InternalOCLinEcore.g:20575:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
            // InternalOCLinEcore.g:20575:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__OwnedTermsAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__1__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__2"
    // InternalOCLinEcore.g:20585:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
    public final void rule__SquareBracketedClauseCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20589:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:20590:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_111);
            rule__SquareBracketedClauseCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__2"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__2__Impl"
    // InternalOCLinEcore.g:20597:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
    public final void rule__SquareBracketedClauseCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20601:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
            // InternalOCLinEcore.g:20602:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
            {
            // InternalOCLinEcore.g:20602:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
            // InternalOCLinEcore.g:20603:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:20604:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
            loop212:
            do {
                int alt212=2;
                int LA212_0 = input.LA(1);

                if ( (LA212_0==105) ) {
                    alt212=1;
                }


                switch (alt212) {
            	case 1 :
            	    // InternalOCLinEcore.g:20604:2: rule__SquareBracketedClauseCS__Group_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__SquareBracketedClauseCS__Group_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__2__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__3"
    // InternalOCLinEcore.g:20614:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
    public final void rule__SquareBracketedClauseCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20618:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:20619:2: rule__SquareBracketedClauseCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__3"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__3__Impl"
    // InternalOCLinEcore.g:20625:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
    public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20629:1: ( ( ']' ) )
            // InternalOCLinEcore.g:20630:1: ( ']' )
            {
            // InternalOCLinEcore.g:20630:1: ( ']' )
            // InternalOCLinEcore.g:20631:1: ']'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
            }
            match(input,118,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group__3__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0"
    // InternalOCLinEcore.g:20652:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
    public final void rule__SquareBracketedClauseCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20656:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
            // InternalOCLinEcore.g:20657:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__SquareBracketedClauseCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group_2__0"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:20664:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
    public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20668:1: ( ( ',' ) )
            // InternalOCLinEcore.g:20669:1: ( ',' )
            {
            // InternalOCLinEcore.g:20669:1: ( ',' )
            // InternalOCLinEcore.g:20670:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group_2__0__Impl"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1"
    // InternalOCLinEcore.g:20683:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
    public final void rule__SquareBracketedClauseCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20687:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:20688:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group_2__1"


    // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:20694:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
    public final void rule__SquareBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20698:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:20699:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:20699:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
            // InternalOCLinEcore.g:20700:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
            }
            // InternalOCLinEcore.g:20701:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
            // InternalOCLinEcore.g:20701:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__Group_2__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0__0"
    // InternalOCLinEcore.g:20715:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
    public final void rule__NavigatingArgCS__Group_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20719:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
            // InternalOCLinEcore.g:20720:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingArgCS__Group_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0__0__Impl"
    // InternalOCLinEcore.g:20727:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
    public final void rule__NavigatingArgCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20731:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
            // InternalOCLinEcore.g:20732:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
            {
            // InternalOCLinEcore.g:20732:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
            // InternalOCLinEcore.g:20733:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
            }
            // InternalOCLinEcore.g:20734:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
            // InternalOCLinEcore.g:20734:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0__1"
    // InternalOCLinEcore.g:20744:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20748:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:20749:2: rule__NavigatingArgCS__Group_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0__1__Impl"
    // InternalOCLinEcore.g:20755:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
    public final void rule__NavigatingArgCS__Group_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20759:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
            // InternalOCLinEcore.g:20760:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
            {
            // InternalOCLinEcore.g:20760:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
            // InternalOCLinEcore.g:20761:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
            }
            // InternalOCLinEcore.g:20762:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==104||LA213_0==113||LA213_0==119) ) {
                alt213=1;
            }
            switch (alt213) {
                case 1 :
                    // InternalOCLinEcore.g:20762:2: rule__NavigatingArgCS__Alternatives_0_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Alternatives_0_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0"
    // InternalOCLinEcore.g:20776:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20780:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
            // InternalOCLinEcore.g:20781:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingArgCS__Group_0_1_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0__Impl"
    // InternalOCLinEcore.g:20788:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20792:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:20793:1: ( '<-' )
            {
            // InternalOCLinEcore.g:20793:1: ( '<-' )
            // InternalOCLinEcore.g:20794:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1"
    // InternalOCLinEcore.g:20807:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
    public final void rule__NavigatingArgCS__Group_0_1_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20811:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
            // InternalOCLinEcore.g:20812:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__NavigatingArgCS__Group_0_1_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1__Impl"
    // InternalOCLinEcore.g:20819:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20823:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
            // InternalOCLinEcore.g:20824:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
            {
            // InternalOCLinEcore.g:20824:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
            // InternalOCLinEcore.g:20825:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
            }
            // InternalOCLinEcore.g:20826:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
            // InternalOCLinEcore.g:20826:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2"
    // InternalOCLinEcore.g:20836:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20840:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
            // InternalOCLinEcore.g:20841:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__2"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2__Impl"
    // InternalOCLinEcore.g:20847:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20851:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
            // InternalOCLinEcore.g:20852:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
            {
            // InternalOCLinEcore.g:20852:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
            // InternalOCLinEcore.g:20853:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
            }
            // InternalOCLinEcore.g:20854:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
            int alt214=2;
            int LA214_0 = input.LA(1);

            if ( (LA214_0==71) ) {
                alt214=1;
            }
            switch (alt214) {
                case 1 :
                    // InternalOCLinEcore.g:20854:2: rule__NavigatingArgCS__Group_0_1_0_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_0_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0__2__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0"
    // InternalOCLinEcore.g:20870:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_0_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20874:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
            // InternalOCLinEcore.g:20875:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingArgCS__Group_0_1_0_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_0_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0_2__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"
    // InternalOCLinEcore.g:20882:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20886:1: ( ( '=' ) )
            // InternalOCLinEcore.g:20887:1: ( '=' )
            {
            // InternalOCLinEcore.g:20887:1: ( '=' )
            // InternalOCLinEcore.g:20888:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1"
    // InternalOCLinEcore.g:20901:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_0_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20905:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
            // InternalOCLinEcore.g:20906:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_0_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0_2__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"
    // InternalOCLinEcore.g:20912:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20916:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
            // InternalOCLinEcore.g:20917:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
            {
            // InternalOCLinEcore.g:20917:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
            // InternalOCLinEcore.g:20918:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
            }
            // InternalOCLinEcore.g:20919:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
            // InternalOCLinEcore.g:20919:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0"
    // InternalOCLinEcore.g:20933:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20937:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
            // InternalOCLinEcore.g:20938:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingArgCS__Group_0_1_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0__Impl"
    // InternalOCLinEcore.g:20945:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20949:1: ( ( ':' ) )
            // InternalOCLinEcore.g:20950:1: ( ':' )
            {
            // InternalOCLinEcore.g:20950:1: ( ':' )
            // InternalOCLinEcore.g:20951:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1"
    // InternalOCLinEcore.g:20964:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
    public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20968:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
            // InternalOCLinEcore.g:20969:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
            {
            pushFollow(FollowSets000.FOLLOW_113);
            rule__NavigatingArgCS__Group_0_1_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
    // InternalOCLinEcore.g:20976:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20980:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
            // InternalOCLinEcore.g:20981:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
            {
            // InternalOCLinEcore.g:20981:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
            // InternalOCLinEcore.g:20982:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
            }
            // InternalOCLinEcore.g:20983:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
            // InternalOCLinEcore.g:20983:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2"
    // InternalOCLinEcore.g:20993:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
    public final void rule__NavigatingArgCS__Group_0_1_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20997:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
            // InternalOCLinEcore.g:20998:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
            {
            pushFollow(FollowSets000.FOLLOW_113);
            rule__NavigatingArgCS__Group_0_1_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__2"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2__Impl"
    // InternalOCLinEcore.g:21005:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21009:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
            // InternalOCLinEcore.g:21010:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
            {
            // InternalOCLinEcore.g:21010:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
            // InternalOCLinEcore.g:21011:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
            }
            // InternalOCLinEcore.g:21012:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==113) ) {
                alt215=1;
            }
            switch (alt215) {
                case 1 :
                    // InternalOCLinEcore.g:21012:2: rule__NavigatingArgCS__Group_0_1_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__2__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3"
    // InternalOCLinEcore.g:21022:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21026:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
            // InternalOCLinEcore.g:21027:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__3"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3__Impl"
    // InternalOCLinEcore.g:21033:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21037:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
            // InternalOCLinEcore.g:21038:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
            {
            // InternalOCLinEcore.g:21038:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
            // InternalOCLinEcore.g:21039:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
            }
            // InternalOCLinEcore.g:21040:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
            int alt216=2;
            int LA216_0 = input.LA(1);

            if ( (LA216_0==71) ) {
                alt216=1;
            }
            switch (alt216) {
                case 1 :
                    // InternalOCLinEcore.g:21040:2: rule__NavigatingArgCS__Group_0_1_1_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_1_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1__3__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0"
    // InternalOCLinEcore.g:21058:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21062:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
            // InternalOCLinEcore.g:21063:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingArgCS__Group_0_1_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_2__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"
    // InternalOCLinEcore.g:21070:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21074:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:21075:1: ( '<-' )
            {
            // InternalOCLinEcore.g:21075:1: ( '<-' )
            // InternalOCLinEcore.g:21076:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1"
    // InternalOCLinEcore.g:21089:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21093:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
            // InternalOCLinEcore.g:21094:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_2__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"
    // InternalOCLinEcore.g:21100:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21104:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
            // InternalOCLinEcore.g:21105:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
            {
            // InternalOCLinEcore.g:21105:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
            // InternalOCLinEcore.g:21106:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
            }
            // InternalOCLinEcore.g:21107:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
            // InternalOCLinEcore.g:21107:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0"
    // InternalOCLinEcore.g:21121:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_1_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21125:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
            // InternalOCLinEcore.g:21126:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingArgCS__Group_0_1_1_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_3__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"
    // InternalOCLinEcore.g:21133:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21137:1: ( ( '=' ) )
            // InternalOCLinEcore.g:21138:1: ( '=' )
            {
            // InternalOCLinEcore.g:21138:1: ( '=' )
            // InternalOCLinEcore.g:21139:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1"
    // InternalOCLinEcore.g:21152:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_1_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21156:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
            // InternalOCLinEcore.g:21157:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_1_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_3__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"
    // InternalOCLinEcore.g:21163:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21167:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
            // InternalOCLinEcore.g:21168:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
            {
            // InternalOCLinEcore.g:21168:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
            // InternalOCLinEcore.g:21169:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
            }
            // InternalOCLinEcore.g:21170:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
            // InternalOCLinEcore.g:21170:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0"
    // InternalOCLinEcore.g:21184:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21188:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
            // InternalOCLinEcore.g:21189:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingArgCS__Group_0_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0__Impl"
    // InternalOCLinEcore.g:21196:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21200:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
            // InternalOCLinEcore.g:21201:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
            {
            // InternalOCLinEcore.g:21201:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
            // InternalOCLinEcore.g:21202:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
            }
            // InternalOCLinEcore.g:21203:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==104) ) {
                alt217=1;
            }
            switch (alt217) {
                case 1 :
                    // InternalOCLinEcore.g:21203:2: rule__NavigatingArgCS__Group_0_1_2_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_2_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1"
    // InternalOCLinEcore.g:21213:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
    public final void rule__NavigatingArgCS__Group_0_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21217:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
            // InternalOCLinEcore.g:21218:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingArgCS__Group_0_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1__Impl"
    // InternalOCLinEcore.g:21225:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21229:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
            // InternalOCLinEcore.g:21230:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
            {
            // InternalOCLinEcore.g:21230:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
            // InternalOCLinEcore.g:21231:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
            }
            // InternalOCLinEcore.g:21232:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
            int alt218=2;
            int LA218_0 = input.LA(1);

            if ( (LA218_0==113) ) {
                alt218=1;
            }
            switch (alt218) {
                case 1 :
                    // InternalOCLinEcore.g:21232:2: rule__NavigatingArgCS__Group_0_1_2_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingArgCS__Group_0_1_2_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2"
    // InternalOCLinEcore.g:21242:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
    public final void rule__NavigatingArgCS__Group_0_1_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21246:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
            // InternalOCLinEcore.g:21247:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingArgCS__Group_0_1_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__2"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2__Impl"
    // InternalOCLinEcore.g:21254:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21258:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:21259:1: ( 'in' )
            {
            // InternalOCLinEcore.g:21259:1: ( 'in' )
            // InternalOCLinEcore.g:21260:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
            }
            match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__2__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3"
    // InternalOCLinEcore.g:21273:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21277:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
            // InternalOCLinEcore.g:21278:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__3"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3__Impl"
    // InternalOCLinEcore.g:21284:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21288:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
            // InternalOCLinEcore.g:21289:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
            {
            // InternalOCLinEcore.g:21289:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
            // InternalOCLinEcore.g:21290:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
            }
            // InternalOCLinEcore.g:21291:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
            // InternalOCLinEcore.g:21291:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2__3__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0"
    // InternalOCLinEcore.g:21309:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21313:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
            // InternalOCLinEcore.g:21314:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingArgCS__Group_0_1_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_0__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"
    // InternalOCLinEcore.g:21321:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21325:1: ( ( ':' ) )
            // InternalOCLinEcore.g:21326:1: ( ':' )
            {
            // InternalOCLinEcore.g:21326:1: ( ':' )
            // InternalOCLinEcore.g:21327:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1"
    // InternalOCLinEcore.g:21340:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21344:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
            // InternalOCLinEcore.g:21345:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_0__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"
    // InternalOCLinEcore.g:21351:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21355:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
            // InternalOCLinEcore.g:21356:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
            {
            // InternalOCLinEcore.g:21356:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
            // InternalOCLinEcore.g:21357:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
            }
            // InternalOCLinEcore.g:21358:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
            // InternalOCLinEcore.g:21358:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0"
    // InternalOCLinEcore.g:21372:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
    public final void rule__NavigatingArgCS__Group_0_1_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21376:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
            // InternalOCLinEcore.g:21377:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingArgCS__Group_0_1_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_1__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"
    // InternalOCLinEcore.g:21384:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21388:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:21389:1: ( '<-' )
            {
            // InternalOCLinEcore.g:21389:1: ( '<-' )
            // InternalOCLinEcore.g:21390:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1"
    // InternalOCLinEcore.g:21403:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21407:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
            // InternalOCLinEcore.g:21408:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_1_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_1__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"
    // InternalOCLinEcore.g:21414:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21418:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
            // InternalOCLinEcore.g:21419:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
            {
            // InternalOCLinEcore.g:21419:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
            // InternalOCLinEcore.g:21420:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
            }
            // InternalOCLinEcore.g:21421:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
            // InternalOCLinEcore.g:21421:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_1__0"
    // InternalOCLinEcore.g:21435:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
    public final void rule__NavigatingArgCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21439:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
            // InternalOCLinEcore.g:21440:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingArgCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_1__0"


    // $ANTLR start "rule__NavigatingArgCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:21447:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21451:1: ( ( ':' ) )
            // InternalOCLinEcore.g:21452:1: ( ':' )
            {
            // InternalOCLinEcore.g:21452:1: ( ':' )
            // InternalOCLinEcore.g:21453:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_1__0__Impl"


    // $ANTLR start "rule__NavigatingArgCS__Group_1__1"
    // InternalOCLinEcore.g:21466:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
    public final void rule__NavigatingArgCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21470:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:21471:2: rule__NavigatingArgCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_1__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:21477:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21481:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:21482:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:21482:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:21483:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:21484:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:21484:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__Group_1__1__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__0"
    // InternalOCLinEcore.g:21498:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
    public final void rule__NavigatingBarArgCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21502:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
            // InternalOCLinEcore.g:21503:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingBarArgCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__0"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__0__Impl"
    // InternalOCLinEcore.g:21510:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
    public final void rule__NavigatingBarArgCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21514:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:21515:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:21515:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:21516:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:21517:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:21517:2: rule__NavigatingBarArgCS__PrefixAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__PrefixAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__0__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__1"
    // InternalOCLinEcore.g:21527:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
    public final void rule__NavigatingBarArgCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21531:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
            // InternalOCLinEcore.g:21532:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__NavigatingBarArgCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__1"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__1__Impl"
    // InternalOCLinEcore.g:21539:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
    public final void rule__NavigatingBarArgCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21543:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:21544:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21544:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:21545:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:21546:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:21546:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__1__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__2"
    // InternalOCLinEcore.g:21556:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
    public final void rule__NavigatingBarArgCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21560:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:21561:2: rule__NavigatingBarArgCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__2"


    // $ANTLR start "rule__NavigatingBarArgCS__Group__2__Impl"
    // InternalOCLinEcore.g:21567:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
    public final void rule__NavigatingBarArgCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21571:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:21572:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:21572:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
            // InternalOCLinEcore.g:21573:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:21574:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==104) ) {
                alt219=1;
            }
            switch (alt219) {
                case 1 :
                    // InternalOCLinEcore.g:21574:2: rule__NavigatingBarArgCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingBarArgCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group__2__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0"
    // InternalOCLinEcore.g:21590:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
    public final void rule__NavigatingBarArgCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21594:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
            // InternalOCLinEcore.g:21595:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingBarArgCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__0"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:21602:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21606:1: ( ( ':' ) )
            // InternalOCLinEcore.g:21607:1: ( ':' )
            {
            // InternalOCLinEcore.g:21607:1: ( ':' )
            // InternalOCLinEcore.g:21608:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__0__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1"
    // InternalOCLinEcore.g:21621:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
    public final void rule__NavigatingBarArgCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21625:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
            // InternalOCLinEcore.g:21626:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__NavigatingBarArgCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__1"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:21633:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
    public final void rule__NavigatingBarArgCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21637:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:21638:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:21638:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:21639:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:21640:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:21640:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__1__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2"
    // InternalOCLinEcore.g:21650:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
    public final void rule__NavigatingBarArgCS__Group_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21654:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:21655:2: rule__NavigatingBarArgCS__Group_2__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__2"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2__Impl"
    // InternalOCLinEcore.g:21661:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
    public final void rule__NavigatingBarArgCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21665:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
            // InternalOCLinEcore.g:21666:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
            {
            // InternalOCLinEcore.g:21666:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
            // InternalOCLinEcore.g:21667:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:21668:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
            int alt220=2;
            int LA220_0 = input.LA(1);

            if ( (LA220_0==71) ) {
                alt220=1;
            }
            switch (alt220) {
                case 1 :
                    // InternalOCLinEcore.g:21668:2: rule__NavigatingBarArgCS__Group_2_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingBarArgCS__Group_2_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2__2__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0"
    // InternalOCLinEcore.g:21684:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
    public final void rule__NavigatingBarArgCS__Group_2_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21688:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
            // InternalOCLinEcore.g:21689:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingBarArgCS__Group_2_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group_2_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2_2__0"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0__Impl"
    // InternalOCLinEcore.g:21696:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
    public final void rule__NavigatingBarArgCS__Group_2_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21700:1: ( ( '=' ) )
            // InternalOCLinEcore.g:21701:1: ( '=' )
            {
            // InternalOCLinEcore.g:21701:1: ( '=' )
            // InternalOCLinEcore.g:21702:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2_2__0__Impl"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1"
    // InternalOCLinEcore.g:21715:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
    public final void rule__NavigatingBarArgCS__Group_2_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21719:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:21720:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__Group_2_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2_2__1"


    // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1__Impl"
    // InternalOCLinEcore.g:21726:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
    public final void rule__NavigatingBarArgCS__Group_2_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21730:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:21731:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:21731:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:21732:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:21733:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
            // InternalOCLinEcore.g:21733:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__Group_2_2__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__0"
    // InternalOCLinEcore.g:21747:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
    public final void rule__NavigatingCommaArgCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21751:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
            // InternalOCLinEcore.g:21752:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingCommaArgCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__0__Impl"
    // InternalOCLinEcore.g:21759:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21763:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:21764:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:21764:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:21765:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:21766:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:21766:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__PrefixAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__1"
    // InternalOCLinEcore.g:21776:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
    public final void rule__NavigatingCommaArgCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21780:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
            // InternalOCLinEcore.g:21781:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingCommaArgCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__1__Impl"
    // InternalOCLinEcore.g:21788:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21792:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:21793:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21793:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:21794:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:21795:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:21795:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__2"
    // InternalOCLinEcore.g:21805:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
    public final void rule__NavigatingCommaArgCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21809:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:21810:2: rule__NavigatingCommaArgCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__2"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group__2__Impl"
    // InternalOCLinEcore.g:21816:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21820:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
            // InternalOCLinEcore.g:21821:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
            {
            // InternalOCLinEcore.g:21821:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
            // InternalOCLinEcore.g:21822:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:21823:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( (LA221_0==104||LA221_0==113||LA221_0==119) ) {
                alt221=1;
            }
            switch (alt221) {
                case 1 :
                    // InternalOCLinEcore.g:21823:2: rule__NavigatingCommaArgCS__Alternatives_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Alternatives_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group__2__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0"
    // InternalOCLinEcore.g:21839:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21843:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
            // InternalOCLinEcore.g:21844:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingCommaArgCS__Group_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"
    // InternalOCLinEcore.g:21851:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21855:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:21856:1: ( '<-' )
            {
            // InternalOCLinEcore.g:21856:1: ( '<-' )
            // InternalOCLinEcore.g:21857:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1"
    // InternalOCLinEcore.g:21870:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21874:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
            // InternalOCLinEcore.g:21875:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__NavigatingCommaArgCS__Group_2_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_0__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"
    // InternalOCLinEcore.g:21882:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21886:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
            // InternalOCLinEcore.g:21887:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
            {
            // InternalOCLinEcore.g:21887:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
            // InternalOCLinEcore.g:21888:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
            }
            // InternalOCLinEcore.g:21889:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
            // InternalOCLinEcore.g:21889:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2"
    // InternalOCLinEcore.g:21899:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21903:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
            // InternalOCLinEcore.g:21904:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_0__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__2"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"
    // InternalOCLinEcore.g:21910:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21914:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
            // InternalOCLinEcore.g:21915:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
            {
            // InternalOCLinEcore.g:21915:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
            // InternalOCLinEcore.g:21916:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
            }
            // InternalOCLinEcore.g:21917:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==71) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // InternalOCLinEcore.g:21917:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_0_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0"
    // InternalOCLinEcore.g:21933:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_0_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21937:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
            // InternalOCLinEcore.g:21938:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_0_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0_2__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"
    // InternalOCLinEcore.g:21945:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21949:1: ( ( '=' ) )
            // InternalOCLinEcore.g:21950:1: ( '=' )
            {
            // InternalOCLinEcore.g:21950:1: ( '=' )
            // InternalOCLinEcore.g:21951:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1"
    // InternalOCLinEcore.g:21964:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_0_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21968:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
            // InternalOCLinEcore.g:21969:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0_2__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"
    // InternalOCLinEcore.g:21975:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21979:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
            // InternalOCLinEcore.g:21980:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
            {
            // InternalOCLinEcore.g:21980:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
            // InternalOCLinEcore.g:21981:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
            }
            // InternalOCLinEcore.g:21982:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
            // InternalOCLinEcore.g:21982:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0"
    // InternalOCLinEcore.g:21996:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22000:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
            // InternalOCLinEcore.g:22001:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingCommaArgCS__Group_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"
    // InternalOCLinEcore.g:22008:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22012:1: ( ( ':' ) )
            // InternalOCLinEcore.g:22013:1: ( ':' )
            {
            // InternalOCLinEcore.g:22013:1: ( ':' )
            // InternalOCLinEcore.g:22014:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1"
    // InternalOCLinEcore.g:22027:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22031:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
            // InternalOCLinEcore.g:22032:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
            {
            pushFollow(FollowSets000.FOLLOW_113);
            rule__NavigatingCommaArgCS__Group_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:22039:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22043:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:22044:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:22044:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:22045:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:22046:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
            // InternalOCLinEcore.g:22046:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2"
    // InternalOCLinEcore.g:22056:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22060:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
            // InternalOCLinEcore.g:22061:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
            {
            pushFollow(FollowSets000.FOLLOW_113);
            rule__NavigatingCommaArgCS__Group_2_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__2"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"
    // InternalOCLinEcore.g:22068:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22072:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
            // InternalOCLinEcore.g:22073:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
            {
            // InternalOCLinEcore.g:22073:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
            // InternalOCLinEcore.g:22074:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
            }
            // InternalOCLinEcore.g:22075:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==113) ) {
                alt223=1;
            }
            switch (alt223) {
                case 1 :
                    // InternalOCLinEcore.g:22075:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_1_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3"
    // InternalOCLinEcore.g:22085:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22089:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
            // InternalOCLinEcore.g:22090:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__3"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"
    // InternalOCLinEcore.g:22096:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22100:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
            // InternalOCLinEcore.g:22101:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
            {
            // InternalOCLinEcore.g:22101:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
            // InternalOCLinEcore.g:22102:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
            }
            // InternalOCLinEcore.g:22103:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
            int alt224=2;
            int LA224_0 = input.LA(1);

            if ( (LA224_0==71) ) {
                alt224=1;
            }
            switch (alt224) {
                case 1 :
                    // InternalOCLinEcore.g:22103:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_1_3__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0"
    // InternalOCLinEcore.g:22121:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22125:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
            // InternalOCLinEcore.g:22126:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_2__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"
    // InternalOCLinEcore.g:22133:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22137:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:22138:1: ( '<-' )
            {
            // InternalOCLinEcore.g:22138:1: ( '<-' )
            // InternalOCLinEcore.g:22139:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1"
    // InternalOCLinEcore.g:22152:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22156:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
            // InternalOCLinEcore.g:22157:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_2__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"
    // InternalOCLinEcore.g:22163:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22167:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
            // InternalOCLinEcore.g:22168:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
            {
            // InternalOCLinEcore.g:22168:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
            // InternalOCLinEcore.g:22169:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
            }
            // InternalOCLinEcore.g:22170:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
            // InternalOCLinEcore.g:22170:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0"
    // InternalOCLinEcore.g:22184:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22188:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
            // InternalOCLinEcore.g:22189:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1_3__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_3__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"
    // InternalOCLinEcore.g:22196:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22200:1: ( ( '=' ) )
            // InternalOCLinEcore.g:22201:1: ( '=' )
            {
            // InternalOCLinEcore.g:22201:1: ( '=' )
            // InternalOCLinEcore.g:22202:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1"
    // InternalOCLinEcore.g:22215:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22219:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
            // InternalOCLinEcore.g:22220:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_3__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"
    // InternalOCLinEcore.g:22226:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22230:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
            // InternalOCLinEcore.g:22231:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
            {
            // InternalOCLinEcore.g:22231:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
            // InternalOCLinEcore.g:22232:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
            }
            // InternalOCLinEcore.g:22233:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
            // InternalOCLinEcore.g:22233:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0"
    // InternalOCLinEcore.g:22247:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22251:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
            // InternalOCLinEcore.g:22252:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingCommaArgCS__Group_2_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"
    // InternalOCLinEcore.g:22259:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22263:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
            // InternalOCLinEcore.g:22264:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
            {
            // InternalOCLinEcore.g:22264:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
            // InternalOCLinEcore.g:22265:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
            }
            // InternalOCLinEcore.g:22266:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
            int alt225=2;
            int LA225_0 = input.LA(1);

            if ( (LA225_0==104) ) {
                alt225=1;
            }
            switch (alt225) {
                case 1 :
                    // InternalOCLinEcore.g:22266:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_2_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1"
    // InternalOCLinEcore.g:22276:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22280:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
            // InternalOCLinEcore.g:22281:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
            {
            pushFollow(FollowSets000.FOLLOW_112);
            rule__NavigatingCommaArgCS__Group_2_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"
    // InternalOCLinEcore.g:22288:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22292:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
            // InternalOCLinEcore.g:22293:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
            {
            // InternalOCLinEcore.g:22293:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
            // InternalOCLinEcore.g:22294:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
            }
            // InternalOCLinEcore.g:22295:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
            int alt226=2;
            int LA226_0 = input.LA(1);

            if ( (LA226_0==113) ) {
                alt226=1;
            }
            switch (alt226) {
                case 1 :
                    // InternalOCLinEcore.g:22295:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingCommaArgCS__Group_2_2_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2"
    // InternalOCLinEcore.g:22305:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22309:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
            // InternalOCLinEcore.g:22310:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingCommaArgCS__Group_2_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__2"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"
    // InternalOCLinEcore.g:22317:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22321:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:22322:1: ( 'in' )
            {
            // InternalOCLinEcore.g:22322:1: ( 'in' )
            // InternalOCLinEcore.g:22323:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
            }
            match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3"
    // InternalOCLinEcore.g:22336:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22340:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
            // InternalOCLinEcore.g:22341:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__3"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"
    // InternalOCLinEcore.g:22347:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22351:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
            // InternalOCLinEcore.g:22352:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
            {
            // InternalOCLinEcore.g:22352:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
            // InternalOCLinEcore.g:22353:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
            }
            // InternalOCLinEcore.g:22354:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
            // InternalOCLinEcore.g:22354:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0"
    // InternalOCLinEcore.g:22372:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22376:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
            // InternalOCLinEcore.g:22377:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2_0__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_0__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"
    // InternalOCLinEcore.g:22384:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22388:1: ( ( ':' ) )
            // InternalOCLinEcore.g:22389:1: ( ':' )
            {
            // InternalOCLinEcore.g:22389:1: ( ':' )
            // InternalOCLinEcore.g:22390:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1"
    // InternalOCLinEcore.g:22403:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22407:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
            // InternalOCLinEcore.g:22408:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_0__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"
    // InternalOCLinEcore.g:22414:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22418:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
            // InternalOCLinEcore.g:22419:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
            {
            // InternalOCLinEcore.g:22419:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
            // InternalOCLinEcore.g:22420:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
            }
            // InternalOCLinEcore.g:22421:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
            // InternalOCLinEcore.g:22421:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0"
    // InternalOCLinEcore.g:22435:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22439:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
            // InternalOCLinEcore.g:22440:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_1__0"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"
    // InternalOCLinEcore.g:22447:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22451:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:22452:1: ( '<-' )
            {
            // InternalOCLinEcore.g:22452:1: ( '<-' )
            // InternalOCLinEcore.g:22453:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1"
    // InternalOCLinEcore.g:22466:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22470:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
            // InternalOCLinEcore.g:22471:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_1__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"
    // InternalOCLinEcore.g:22477:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22481:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
            // InternalOCLinEcore.g:22482:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
            {
            // InternalOCLinEcore.g:22482:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
            // InternalOCLinEcore.g:22483:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
            }
            // InternalOCLinEcore.g:22484:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
            // InternalOCLinEcore.g:22484:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__0"
    // InternalOCLinEcore.g:22498:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
    public final void rule__NavigatingSemiArgCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22502:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
            // InternalOCLinEcore.g:22503:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingSemiArgCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__0"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__0__Impl"
    // InternalOCLinEcore.g:22510:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
    public final void rule__NavigatingSemiArgCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22514:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:22515:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22515:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:22516:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:22517:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:22517:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__PrefixAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__0__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__1"
    // InternalOCLinEcore.g:22527:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
    public final void rule__NavigatingSemiArgCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22531:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
            // InternalOCLinEcore.g:22532:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__NavigatingSemiArgCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__1"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__1__Impl"
    // InternalOCLinEcore.g:22539:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
    public final void rule__NavigatingSemiArgCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22543:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:22544:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:22544:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:22545:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:22546:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:22546:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__1__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__2"
    // InternalOCLinEcore.g:22556:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
    public final void rule__NavigatingSemiArgCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22560:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:22561:2: rule__NavigatingSemiArgCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__2"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group__2__Impl"
    // InternalOCLinEcore.g:22567:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
    public final void rule__NavigatingSemiArgCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22571:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:22572:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:22572:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
            // InternalOCLinEcore.g:22573:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:22574:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
            int alt227=2;
            int LA227_0 = input.LA(1);

            if ( (LA227_0==104) ) {
                alt227=1;
            }
            switch (alt227) {
                case 1 :
                    // InternalOCLinEcore.g:22574:2: rule__NavigatingSemiArgCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingSemiArgCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group__2__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0"
    // InternalOCLinEcore.g:22590:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
    public final void rule__NavigatingSemiArgCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22594:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
            // InternalOCLinEcore.g:22595:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__NavigatingSemiArgCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__0"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:22602:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22606:1: ( ( ':' ) )
            // InternalOCLinEcore.g:22607:1: ( ':' )
            {
            // InternalOCLinEcore.g:22607:1: ( ':' )
            // InternalOCLinEcore.g:22608:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__0__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1"
    // InternalOCLinEcore.g:22621:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
    public final void rule__NavigatingSemiArgCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22625:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
            // InternalOCLinEcore.g:22626:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__NavigatingSemiArgCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group_2__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__1"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:22633:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
    public final void rule__NavigatingSemiArgCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22637:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:22638:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:22638:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:22639:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:22640:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:22640:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__1__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2"
    // InternalOCLinEcore.g:22650:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
    public final void rule__NavigatingSemiArgCS__Group_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22654:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:22655:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__2"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2__Impl"
    // InternalOCLinEcore.g:22661:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
    public final void rule__NavigatingSemiArgCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22665:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
            // InternalOCLinEcore.g:22666:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
            {
            // InternalOCLinEcore.g:22666:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
            // InternalOCLinEcore.g:22667:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:22668:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
            int alt228=2;
            int LA228_0 = input.LA(1);

            if ( (LA228_0==71) ) {
                alt228=1;
            }
            switch (alt228) {
                case 1 :
                    // InternalOCLinEcore.g:22668:2: rule__NavigatingSemiArgCS__Group_2_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__NavigatingSemiArgCS__Group_2_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2__2__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0"
    // InternalOCLinEcore.g:22684:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
    public final void rule__NavigatingSemiArgCS__Group_2_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22688:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
            // InternalOCLinEcore.g:22689:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NavigatingSemiArgCS__Group_2_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group_2_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2_2__0"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"
    // InternalOCLinEcore.g:22696:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
    public final void rule__NavigatingSemiArgCS__Group_2_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22700:1: ( ( '=' ) )
            // InternalOCLinEcore.g:22701:1: ( '=' )
            {
            // InternalOCLinEcore.g:22701:1: ( '=' )
            // InternalOCLinEcore.g:22702:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1"
    // InternalOCLinEcore.g:22715:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
    public final void rule__NavigatingSemiArgCS__Group_2_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22719:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:22720:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__Group_2_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2_2__1"


    // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"
    // InternalOCLinEcore.g:22726:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
    public final void rule__NavigatingSemiArgCS__Group_2_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22730:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:22731:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:22731:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:22732:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:22733:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
            // InternalOCLinEcore.g:22733:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"


    // $ANTLR start "rule__CoIteratorVariableCS__Group__0"
    // InternalOCLinEcore.g:22747:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
    public final void rule__CoIteratorVariableCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22751:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
            // InternalOCLinEcore.g:22752:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_51);
            rule__CoIteratorVariableCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group__0"


    // $ANTLR start "rule__CoIteratorVariableCS__Group__0__Impl"
    // InternalOCLinEcore.g:22759:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
    public final void rule__CoIteratorVariableCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22763:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:22764:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22764:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:22765:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:22766:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
            // InternalOCLinEcore.g:22766:2: rule__CoIteratorVariableCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group__0__Impl"


    // $ANTLR start "rule__CoIteratorVariableCS__Group__1"
    // InternalOCLinEcore.g:22776:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
    public final void rule__CoIteratorVariableCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22780:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
            // InternalOCLinEcore.g:22781:2: rule__CoIteratorVariableCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group__1"


    // $ANTLR start "rule__CoIteratorVariableCS__Group__1__Impl"
    // InternalOCLinEcore.g:22787:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
    public final void rule__CoIteratorVariableCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22791:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:22792:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:22792:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
            // InternalOCLinEcore.g:22793:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:22794:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
            int alt229=2;
            int LA229_0 = input.LA(1);

            if ( (LA229_0==104) ) {
                alt229=1;
            }
            switch (alt229) {
                case 1 :
                    // InternalOCLinEcore.g:22794:2: rule__CoIteratorVariableCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CoIteratorVariableCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group__1__Impl"


    // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0"
    // InternalOCLinEcore.g:22808:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
    public final void rule__CoIteratorVariableCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22812:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
            // InternalOCLinEcore.g:22813:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__CoIteratorVariableCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group_1__0"


    // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:22820:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__CoIteratorVariableCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22824:1: ( ( ':' ) )
            // InternalOCLinEcore.g:22825:1: ( ':' )
            {
            // InternalOCLinEcore.g:22825:1: ( ':' )
            // InternalOCLinEcore.g:22826:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group_1__0__Impl"


    // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1"
    // InternalOCLinEcore.g:22839:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
    public final void rule__CoIteratorVariableCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22843:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:22844:2: rule__CoIteratorVariableCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group_1__1"


    // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:22850:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
    public final void rule__CoIteratorVariableCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22854:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:22855:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:22855:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:22856:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:22857:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:22857:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__Group_1__1__Impl"


    // $ANTLR start "rule__IfExpCS__Group__0"
    // InternalOCLinEcore.g:22871:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
    public final void rule__IfExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22875:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
            // InternalOCLinEcore.g:22876:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__IfExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__0"


    // $ANTLR start "rule__IfExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:22883:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
    public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22887:1: ( ( 'if' ) )
            // InternalOCLinEcore.g:22888:1: ( 'if' )
            {
            // InternalOCLinEcore.g:22888:1: ( 'if' )
            // InternalOCLinEcore.g:22889:1: 'if'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
            }
            match(input,120,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__0__Impl"


    // $ANTLR start "rule__IfExpCS__Group__1"
    // InternalOCLinEcore.g:22902:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
    public final void rule__IfExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22906:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
            // InternalOCLinEcore.g:22907:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_114);
            rule__IfExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__1"


    // $ANTLR start "rule__IfExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:22914:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
    public final void rule__IfExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22918:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
            // InternalOCLinEcore.g:22919:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:22919:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
            // InternalOCLinEcore.g:22920:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
            }
            // InternalOCLinEcore.g:22921:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
            // InternalOCLinEcore.g:22921:2: rule__IfExpCS__OwnedConditionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__OwnedConditionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__1__Impl"


    // $ANTLR start "rule__IfExpCS__Group__2"
    // InternalOCLinEcore.g:22931:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
    public final void rule__IfExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22935:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
            // InternalOCLinEcore.g:22936:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__IfExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__2"


    // $ANTLR start "rule__IfExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:22943:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
    public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22947:1: ( ( 'then' ) )
            // InternalOCLinEcore.g:22948:1: ( 'then' )
            {
            // InternalOCLinEcore.g:22948:1: ( 'then' )
            // InternalOCLinEcore.g:22949:1: 'then'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
            }
            match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__2__Impl"


    // $ANTLR start "rule__IfExpCS__Group__3"
    // InternalOCLinEcore.g:22962:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
    public final void rule__IfExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22966:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
            // InternalOCLinEcore.g:22967:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_115);
            rule__IfExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__3"


    // $ANTLR start "rule__IfExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:22974:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
    public final void rule__IfExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22978:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:22979:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:22979:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:22980:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:22981:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
            // InternalOCLinEcore.g:22981:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__OwnedThenExpressionAssignment_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__3__Impl"


    // $ANTLR start "rule__IfExpCS__Group__4"
    // InternalOCLinEcore.g:22991:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
    public final void rule__IfExpCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22995:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
            // InternalOCLinEcore.g:22996:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_115);
            rule__IfExpCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__5();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__4"


    // $ANTLR start "rule__IfExpCS__Group__4__Impl"
    // InternalOCLinEcore.g:23003:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
    public final void rule__IfExpCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23007:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
            // InternalOCLinEcore.g:23008:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
            {
            // InternalOCLinEcore.g:23008:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
            // InternalOCLinEcore.g:23009:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
            }
            // InternalOCLinEcore.g:23010:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
            loop230:
            do {
                int alt230=2;
                int LA230_0 = input.LA(1);

                if ( (LA230_0==124) ) {
                    alt230=1;
                }


                switch (alt230) {
            	case 1 :
            	    // InternalOCLinEcore.g:23010:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
            	    {
            	    pushFollow(FollowSets000.FOLLOW_116);
            	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__4__Impl"


    // $ANTLR start "rule__IfExpCS__Group__5"
    // InternalOCLinEcore.g:23020:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
    public final void rule__IfExpCS__Group__5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23024:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
            // InternalOCLinEcore.g:23025:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__IfExpCS__Group__5__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__6();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__5"


    // $ANTLR start "rule__IfExpCS__Group__5__Impl"
    // InternalOCLinEcore.g:23032:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
    public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23036:1: ( ( 'else' ) )
            // InternalOCLinEcore.g:23037:1: ( 'else' )
            {
            // InternalOCLinEcore.g:23037:1: ( 'else' )
            // InternalOCLinEcore.g:23038:1: 'else'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
            }
            match(input,122,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__5__Impl"


    // $ANTLR start "rule__IfExpCS__Group__6"
    // InternalOCLinEcore.g:23051:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
    public final void rule__IfExpCS__Group__6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23055:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
            // InternalOCLinEcore.g:23056:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_117);
            rule__IfExpCS__Group__6__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__7();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__6"


    // $ANTLR start "rule__IfExpCS__Group__6__Impl"
    // InternalOCLinEcore.g:23063:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
    public final void rule__IfExpCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23067:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
            // InternalOCLinEcore.g:23068:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
            {
            // InternalOCLinEcore.g:23068:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
            // InternalOCLinEcore.g:23069:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
            }
            // InternalOCLinEcore.g:23070:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
            // InternalOCLinEcore.g:23070:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__OwnedElseExpressionAssignment_6();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__6__Impl"


    // $ANTLR start "rule__IfExpCS__Group__7"
    // InternalOCLinEcore.g:23080:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
    public final void rule__IfExpCS__Group__7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23084:1: ( rule__IfExpCS__Group__7__Impl )
            // InternalOCLinEcore.g:23085:2: rule__IfExpCS__Group__7__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__Group__7__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__7"


    // $ANTLR start "rule__IfExpCS__Group__7__Impl"
    // InternalOCLinEcore.g:23091:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
    public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23095:1: ( ( 'endif' ) )
            // InternalOCLinEcore.g:23096:1: ( 'endif' )
            {
            // InternalOCLinEcore.g:23096:1: ( 'endif' )
            // InternalOCLinEcore.g:23097:1: 'endif'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
            }
            match(input,123,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__Group__7__Impl"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__0"
    // InternalOCLinEcore.g:23126:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
    public final void rule__ElseIfThenExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23130:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
            // InternalOCLinEcore.g:23131:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__ElseIfThenExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__0"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:23138:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
    public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23142:1: ( ( 'elseif' ) )
            // InternalOCLinEcore.g:23143:1: ( 'elseif' )
            {
            // InternalOCLinEcore.g:23143:1: ( 'elseif' )
            // InternalOCLinEcore.g:23144:1: 'elseif'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
            }
            match(input,124,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__0__Impl"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__1"
    // InternalOCLinEcore.g:23157:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
    public final void rule__ElseIfThenExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23161:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
            // InternalOCLinEcore.g:23162:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_114);
            rule__ElseIfThenExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__1"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:23169:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
    public final void rule__ElseIfThenExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23173:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
            // InternalOCLinEcore.g:23174:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:23174:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
            // InternalOCLinEcore.g:23175:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
            }
            // InternalOCLinEcore.g:23176:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
            // InternalOCLinEcore.g:23176:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__OwnedConditionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__1__Impl"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__2"
    // InternalOCLinEcore.g:23186:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
    public final void rule__ElseIfThenExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23190:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
            // InternalOCLinEcore.g:23191:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__ElseIfThenExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__2"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:23198:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
    public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23202:1: ( ( 'then' ) )
            // InternalOCLinEcore.g:23203:1: ( 'then' )
            {
            // InternalOCLinEcore.g:23203:1: ( 'then' )
            // InternalOCLinEcore.g:23204:1: 'then'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
            }
            match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__2__Impl"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__3"
    // InternalOCLinEcore.g:23217:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
    public final void rule__ElseIfThenExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23221:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:23222:2: rule__ElseIfThenExpCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__3"


    // $ANTLR start "rule__ElseIfThenExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:23228:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
    public final void rule__ElseIfThenExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23232:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:23233:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:23233:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:23234:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:23235:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
            // InternalOCLinEcore.g:23235:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__Group__3__Impl"


    // $ANTLR start "rule__LetExpCS__Group__0"
    // InternalOCLinEcore.g:23253:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
    public final void rule__LetExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23257:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
            // InternalOCLinEcore.g:23258:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__LetExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__0"


    // $ANTLR start "rule__LetExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:23265:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
    public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23269:1: ( ( 'let' ) )
            // InternalOCLinEcore.g:23270:1: ( 'let' )
            {
            // InternalOCLinEcore.g:23270:1: ( 'let' )
            // InternalOCLinEcore.g:23271:1: 'let'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
            }
            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__0__Impl"


    // $ANTLR start "rule__LetExpCS__Group__1"
    // InternalOCLinEcore.g:23284:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
    public final void rule__LetExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23288:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
            // InternalOCLinEcore.g:23289:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_118);
            rule__LetExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__1"


    // $ANTLR start "rule__LetExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:23296:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
    public final void rule__LetExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23300:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
            // InternalOCLinEcore.g:23301:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
            {
            // InternalOCLinEcore.g:23301:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
            // InternalOCLinEcore.g:23302:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
            }
            // InternalOCLinEcore.g:23303:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
            // InternalOCLinEcore.g:23303:2: rule__LetExpCS__OwnedVariablesAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__OwnedVariablesAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__1__Impl"


    // $ANTLR start "rule__LetExpCS__Group__2"
    // InternalOCLinEcore.g:23313:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
    public final void rule__LetExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23317:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
            // InternalOCLinEcore.g:23318:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_118);
            rule__LetExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__2"


    // $ANTLR start "rule__LetExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:23325:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
    public final void rule__LetExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23329:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
            // InternalOCLinEcore.g:23330:1: ( ( rule__LetExpCS__Group_2__0 )* )
            {
            // InternalOCLinEcore.g:23330:1: ( ( rule__LetExpCS__Group_2__0 )* )
            // InternalOCLinEcore.g:23331:1: ( rule__LetExpCS__Group_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:23332:1: ( rule__LetExpCS__Group_2__0 )*
            loop231:
            do {
                int alt231=2;
                int LA231_0 = input.LA(1);

                if ( (LA231_0==105) ) {
                    alt231=1;
                }


                switch (alt231) {
            	case 1 :
            	    // InternalOCLinEcore.g:23332:2: rule__LetExpCS__Group_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__LetExpCS__Group_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__2__Impl"


    // $ANTLR start "rule__LetExpCS__Group__3"
    // InternalOCLinEcore.g:23342:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
    public final void rule__LetExpCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23346:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
            // InternalOCLinEcore.g:23347:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__LetExpCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__3"


    // $ANTLR start "rule__LetExpCS__Group__3__Impl"
    // InternalOCLinEcore.g:23354:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
    public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23358:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:23359:1: ( 'in' )
            {
            // InternalOCLinEcore.g:23359:1: ( 'in' )
            // InternalOCLinEcore.g:23360:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
            }
            match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getInKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__3__Impl"


    // $ANTLR start "rule__LetExpCS__Group__4"
    // InternalOCLinEcore.g:23373:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
    public final void rule__LetExpCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23377:1: ( rule__LetExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:23378:2: rule__LetExpCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__4"


    // $ANTLR start "rule__LetExpCS__Group__4__Impl"
    // InternalOCLinEcore.g:23384:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
    public final void rule__LetExpCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23388:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
            // InternalOCLinEcore.g:23389:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
            {
            // InternalOCLinEcore.g:23389:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
            // InternalOCLinEcore.g:23390:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
            }
            // InternalOCLinEcore.g:23391:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
            // InternalOCLinEcore.g:23391:2: rule__LetExpCS__OwnedInExpressionAssignment_4
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__OwnedInExpressionAssignment_4();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group__4__Impl"


    // $ANTLR start "rule__LetExpCS__Group_2__0"
    // InternalOCLinEcore.g:23411:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
    public final void rule__LetExpCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23415:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
            // InternalOCLinEcore.g:23416:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__LetExpCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group_2__0"


    // $ANTLR start "rule__LetExpCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:23423:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
    public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23427:1: ( ( ',' ) )
            // InternalOCLinEcore.g:23428:1: ( ',' )
            {
            // InternalOCLinEcore.g:23428:1: ( ',' )
            // InternalOCLinEcore.g:23429:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group_2__0__Impl"


    // $ANTLR start "rule__LetExpCS__Group_2__1"
    // InternalOCLinEcore.g:23442:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
    public final void rule__LetExpCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23446:1: ( rule__LetExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:23447:2: rule__LetExpCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group_2__1"


    // $ANTLR start "rule__LetExpCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:23453:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
    public final void rule__LetExpCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23457:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:23458:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:23458:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
            // InternalOCLinEcore.g:23459:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
            }
            // InternalOCLinEcore.g:23460:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
            // InternalOCLinEcore.g:23460:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetExpCS__OwnedVariablesAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__Group_2__1__Impl"


    // $ANTLR start "rule__LetVariableCS__Group__0"
    // InternalOCLinEcore.g:23474:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
    public final void rule__LetVariableCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23478:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
            // InternalOCLinEcore.g:23479:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_119);
            rule__LetVariableCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__0"


    // $ANTLR start "rule__LetVariableCS__Group__0__Impl"
    // InternalOCLinEcore.g:23486:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
    public final void rule__LetVariableCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23490:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:23491:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:23491:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:23492:1: ( rule__LetVariableCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:23493:1: ( rule__LetVariableCS__NameAssignment_0 )
            // InternalOCLinEcore.g:23493:2: rule__LetVariableCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__0__Impl"


    // $ANTLR start "rule__LetVariableCS__Group__1"
    // InternalOCLinEcore.g:23503:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
    public final void rule__LetVariableCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23507:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
            // InternalOCLinEcore.g:23508:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_119);
            rule__LetVariableCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__1"


    // $ANTLR start "rule__LetVariableCS__Group__1__Impl"
    // InternalOCLinEcore.g:23515:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
    public final void rule__LetVariableCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23519:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
            // InternalOCLinEcore.g:23520:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
            {
            // InternalOCLinEcore.g:23520:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
            // InternalOCLinEcore.g:23521:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
            }
            // InternalOCLinEcore.g:23522:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
            int alt232=2;
            int LA232_0 = input.LA(1);

            if ( (LA232_0==102) ) {
                alt232=1;
            }
            switch (alt232) {
                case 1 :
                    // InternalOCLinEcore.g:23522:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__1__Impl"


    // $ANTLR start "rule__LetVariableCS__Group__2"
    // InternalOCLinEcore.g:23532:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
    public final void rule__LetVariableCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23536:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
            // InternalOCLinEcore.g:23537:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_119);
            rule__LetVariableCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__2"


    // $ANTLR start "rule__LetVariableCS__Group__2__Impl"
    // InternalOCLinEcore.g:23544:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
    public final void rule__LetVariableCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23548:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:23549:1: ( ( rule__LetVariableCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:23549:1: ( ( rule__LetVariableCS__Group_2__0 )? )
            // InternalOCLinEcore.g:23550:1: ( rule__LetVariableCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:23551:1: ( rule__LetVariableCS__Group_2__0 )?
            int alt233=2;
            int LA233_0 = input.LA(1);

            if ( (LA233_0==104) ) {
                alt233=1;
            }
            switch (alt233) {
                case 1 :
                    // InternalOCLinEcore.g:23551:2: rule__LetVariableCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__LetVariableCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__2__Impl"


    // $ANTLR start "rule__LetVariableCS__Group__3"
    // InternalOCLinEcore.g:23561:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
    public final void rule__LetVariableCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23565:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
            // InternalOCLinEcore.g:23566:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__LetVariableCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__4();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__3"


    // $ANTLR start "rule__LetVariableCS__Group__3__Impl"
    // InternalOCLinEcore.g:23573:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
    public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23577:1: ( ( '=' ) )
            // InternalOCLinEcore.g:23578:1: ( '=' )
            {
            // InternalOCLinEcore.g:23578:1: ( '=' )
            // InternalOCLinEcore.g:23579:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
            }
            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__3__Impl"


    // $ANTLR start "rule__LetVariableCS__Group__4"
    // InternalOCLinEcore.g:23592:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
    public final void rule__LetVariableCS__Group__4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23596:1: ( rule__LetVariableCS__Group__4__Impl )
            // InternalOCLinEcore.g:23597:2: rule__LetVariableCS__Group__4__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group__4__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__4"


    // $ANTLR start "rule__LetVariableCS__Group__4__Impl"
    // InternalOCLinEcore.g:23603:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
    public final void rule__LetVariableCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23607:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
            // InternalOCLinEcore.g:23608:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
            {
            // InternalOCLinEcore.g:23608:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
            // InternalOCLinEcore.g:23609:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
            }
            // InternalOCLinEcore.g:23610:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
            // InternalOCLinEcore.g:23610:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__OwnedInitExpressionAssignment_4();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group__4__Impl"


    // $ANTLR start "rule__LetVariableCS__Group_2__0"
    // InternalOCLinEcore.g:23630:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
    public final void rule__LetVariableCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23634:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
            // InternalOCLinEcore.g:23635:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__LetVariableCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group_2__0"


    // $ANTLR start "rule__LetVariableCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:23642:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23646:1: ( ( ':' ) )
            // InternalOCLinEcore.g:23647:1: ( ':' )
            {
            // InternalOCLinEcore.g:23647:1: ( ':' )
            // InternalOCLinEcore.g:23648:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
            }
            match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group_2__0__Impl"


    // $ANTLR start "rule__LetVariableCS__Group_2__1"
    // InternalOCLinEcore.g:23661:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
    public final void rule__LetVariableCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23665:1: ( rule__LetVariableCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:23666:2: rule__LetVariableCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group_2__1"


    // $ANTLR start "rule__LetVariableCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:23672:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
    public final void rule__LetVariableCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23676:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:23677:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:23677:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:23678:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:23679:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:23679:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__LetVariableCS__OwnedTypeAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__Group_2__1__Impl"


    // $ANTLR start "rule__NestedExpCS__Group__0"
    // InternalOCLinEcore.g:23693:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
    public final void rule__NestedExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23697:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
            // InternalOCLinEcore.g:23698:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            rule__NestedExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NestedExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__0"


    // $ANTLR start "rule__NestedExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:23705:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
    public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23709:1: ( ( '(' ) )
            // InternalOCLinEcore.g:23710:1: ( '(' )
            {
            // InternalOCLinEcore.g:23710:1: ( '(' )
            // InternalOCLinEcore.g:23711:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
            }
            match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__0__Impl"


    // $ANTLR start "rule__NestedExpCS__Group__1"
    // InternalOCLinEcore.g:23724:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
    public final void rule__NestedExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23728:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
            // InternalOCLinEcore.g:23729:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            rule__NestedExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NestedExpCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__1"


    // $ANTLR start "rule__NestedExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:23736:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
    public final void rule__NestedExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23740:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:23741:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:23741:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:23742:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:23743:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
            // InternalOCLinEcore.g:23743:2: rule__NestedExpCS__OwnedExpressionAssignment_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NestedExpCS__OwnedExpressionAssignment_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__1__Impl"


    // $ANTLR start "rule__NestedExpCS__Group__2"
    // InternalOCLinEcore.g:23753:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
    public final void rule__NestedExpCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23757:1: ( rule__NestedExpCS__Group__2__Impl )
            // InternalOCLinEcore.g:23758:2: rule__NestedExpCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NestedExpCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__2"


    // $ANTLR start "rule__NestedExpCS__Group__2__Impl"
    // InternalOCLinEcore.g:23764:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
    public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23768:1: ( ( ')' ) )
            // InternalOCLinEcore.g:23769:1: ( ')' )
            {
            // InternalOCLinEcore.g:23769:1: ( ')' )
            // InternalOCLinEcore.g:23770:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
            }
            match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__Group__2__Impl"


    // $ANTLR start "rule__SelfExpCS__Group__0"
    // InternalOCLinEcore.g:23789:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
    public final void rule__SelfExpCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23793:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
            // InternalOCLinEcore.g:23794:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_120);
            rule__SelfExpCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SelfExpCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SelfExpCS__Group__0"


    // $ANTLR start "rule__SelfExpCS__Group__0__Impl"
    // InternalOCLinEcore.g:23801:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
    public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23805:1: ( ( () ) )
            // InternalOCLinEcore.g:23806:1: ( () )
            {
            // InternalOCLinEcore.g:23806:1: ( () )
            // InternalOCLinEcore.g:23807:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
            }
            // InternalOCLinEcore.g:23808:1: ()
            // InternalOCLinEcore.g:23810:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SelfExpCS__Group__0__Impl"


    // $ANTLR start "rule__SelfExpCS__Group__1"
    // InternalOCLinEcore.g:23820:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
    public final void rule__SelfExpCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23824:1: ( rule__SelfExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:23825:2: rule__SelfExpCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__SelfExpCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SelfExpCS__Group__1"


    // $ANTLR start "rule__SelfExpCS__Group__1__Impl"
    // InternalOCLinEcore.g:23831:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
    public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23835:1: ( ( 'self' ) )
            // InternalOCLinEcore.g:23836:1: ( 'self' )
            {
            // InternalOCLinEcore.g:23836:1: ( 'self' )
            // InternalOCLinEcore.g:23837:1: 'self'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
            }
            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SelfExpCS__Group__1__Impl"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
    // InternalOCLinEcore.g:23854:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
    public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23858:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
            // InternalOCLinEcore.g:23859:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_92);
            rule__MultiplicityBoundsCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group__0"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
    // InternalOCLinEcore.g:23866:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
    public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23870:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
            // InternalOCLinEcore.g:23871:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
            {
            // InternalOCLinEcore.g:23871:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
            // InternalOCLinEcore.g:23872:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
            }
            // InternalOCLinEcore.g:23873:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
            // InternalOCLinEcore.g:23873:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__LowerBoundAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group__0__Impl"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
    // InternalOCLinEcore.g:23883:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
    public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23887:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
            // InternalOCLinEcore.g:23888:2: rule__MultiplicityBoundsCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group__1"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
    // InternalOCLinEcore.g:23894:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
    public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23898:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:23899:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:23899:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
            // InternalOCLinEcore.g:23900:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:23901:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
            int alt234=2;
            int LA234_0 = input.LA(1);

            if ( (LA234_0==110) ) {
                alt234=1;
            }
            switch (alt234) {
                case 1 :
                    // InternalOCLinEcore.g:23901:2: rule__MultiplicityBoundsCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__MultiplicityBoundsCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group__1__Impl"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
    // InternalOCLinEcore.g:23915:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
    public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23919:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
            // InternalOCLinEcore.g:23920:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_121);
            rule__MultiplicityBoundsCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group_1__0"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:23927:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
    public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23931:1: ( ( '..' ) )
            // InternalOCLinEcore.g:23932:1: ( '..' )
            {
            // InternalOCLinEcore.g:23932:1: ( '..' )
            // InternalOCLinEcore.g:23933:1: '..'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
            }
            match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group_1__0__Impl"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
    // InternalOCLinEcore.g:23946:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
    public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23950:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:23951:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group_1__1"


    // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:23957:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
    public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23961:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:23962:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:23962:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
            // InternalOCLinEcore.g:23963:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
            }
            // InternalOCLinEcore.g:23964:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
            // InternalOCLinEcore.g:23964:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__Group_1__1__Impl"


    // $ANTLR start "rule__MultiplicityCS__Group__0"
    // InternalOCLinEcore.g:23978:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
    public final void rule__MultiplicityCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23982:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
            // InternalOCLinEcore.g:23983:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_122);
            rule__MultiplicityCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__0"


    // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
    // InternalOCLinEcore.g:23990:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
    public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23994:1: ( ( '[' ) )
            // InternalOCLinEcore.g:23995:1: ( '[' )
            {
            // InternalOCLinEcore.g:23995:1: ( '[' )
            // InternalOCLinEcore.g:23996:1: '['
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
            }
            match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__0__Impl"


    // $ANTLR start "rule__MultiplicityCS__Group__1"
    // InternalOCLinEcore.g:24009:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
    public final void rule__MultiplicityCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24013:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
            // InternalOCLinEcore.g:24014:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_123);
            rule__MultiplicityCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__1"


    // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
    // InternalOCLinEcore.g:24021:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
    public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24025:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
            // InternalOCLinEcore.g:24026:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
            {
            // InternalOCLinEcore.g:24026:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
            // InternalOCLinEcore.g:24027:1: ( rule__MultiplicityCS__Alternatives_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
            }
            // InternalOCLinEcore.g:24028:1: ( rule__MultiplicityCS__Alternatives_1 )
            // InternalOCLinEcore.g:24028:2: rule__MultiplicityCS__Alternatives_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Alternatives_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__1__Impl"


    // $ANTLR start "rule__MultiplicityCS__Group__2"
    // InternalOCLinEcore.g:24038:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
    public final void rule__MultiplicityCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24042:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
            // InternalOCLinEcore.g:24043:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_123);
            rule__MultiplicityCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Group__3();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__2"


    // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
    // InternalOCLinEcore.g:24050:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
    public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24054:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
            // InternalOCLinEcore.g:24055:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
            {
            // InternalOCLinEcore.g:24055:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
            // InternalOCLinEcore.g:24056:1: ( rule__MultiplicityCS__Alternatives_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:24057:1: ( rule__MultiplicityCS__Alternatives_2 )?
            int alt235=2;
            int LA235_0 = input.LA(1);

            if ( (LA235_0==100||LA235_0==143) ) {
                alt235=1;
            }
            switch (alt235) {
                case 1 :
                    // InternalOCLinEcore.g:24057:2: rule__MultiplicityCS__Alternatives_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__MultiplicityCS__Alternatives_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__2__Impl"


    // $ANTLR start "rule__MultiplicityCS__Group__3"
    // InternalOCLinEcore.g:24067:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
    public final void rule__MultiplicityCS__Group__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24071:1: ( rule__MultiplicityCS__Group__3__Impl )
            // InternalOCLinEcore.g:24072:2: rule__MultiplicityCS__Group__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityCS__Group__3__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__3"


    // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
    // InternalOCLinEcore.g:24078:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
    public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24082:1: ( ( ']' ) )
            // InternalOCLinEcore.g:24083:1: ( ']' )
            {
            // InternalOCLinEcore.g:24083:1: ( ']' )
            // InternalOCLinEcore.g:24084:1: ']'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
            }
            match(input,118,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__Group__3__Impl"


    // $ANTLR start "rule__PathNameCS__Group__0"
    // InternalOCLinEcore.g:24105:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
    public final void rule__PathNameCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24109:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
            // InternalOCLinEcore.g:24110:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_86);
            rule__PathNameCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group__0"


    // $ANTLR start "rule__PathNameCS__Group__0__Impl"
    // InternalOCLinEcore.g:24117:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
    public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24121:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
            // InternalOCLinEcore.g:24122:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:24122:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
            // InternalOCLinEcore.g:24123:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }
            // InternalOCLinEcore.g:24124:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
            // InternalOCLinEcore.g:24124:2: rule__PathNameCS__OwnedPathElementsAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__OwnedPathElementsAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group__0__Impl"


    // $ANTLR start "rule__PathNameCS__Group__1"
    // InternalOCLinEcore.g:24134:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
    public final void rule__PathNameCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24138:1: ( rule__PathNameCS__Group__1__Impl )
            // InternalOCLinEcore.g:24139:2: rule__PathNameCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group__1"


    // $ANTLR start "rule__PathNameCS__Group__1__Impl"
    // InternalOCLinEcore.g:24145:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
    public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24149:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:24150:1: ( ( rule__PathNameCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:24150:1: ( ( rule__PathNameCS__Group_1__0 )* )
            // InternalOCLinEcore.g:24151:1: ( rule__PathNameCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:24152:1: ( rule__PathNameCS__Group_1__0 )*
            loop236:
            do {
                int alt236=2;
                int LA236_0 = input.LA(1);

                if ( (LA236_0==109) ) {
                    alt236=1;
                }


                switch (alt236) {
            	case 1 :
            	    // InternalOCLinEcore.g:24152:2: rule__PathNameCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_87);
            	    rule__PathNameCS__Group_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group__1__Impl"


    // $ANTLR start "rule__PathNameCS__Group_1__0"
    // InternalOCLinEcore.g:24166:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
    public final void rule__PathNameCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24170:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
            // InternalOCLinEcore.g:24171:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_88);
            rule__PathNameCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group_1__0"


    // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:24178:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
    public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24182:1: ( ( '::' ) )
            // InternalOCLinEcore.g:24183:1: ( '::' )
            {
            // InternalOCLinEcore.g:24183:1: ( '::' )
            // InternalOCLinEcore.g:24184:1: '::'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
            }
            match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group_1__0__Impl"


    // $ANTLR start "rule__PathNameCS__Group_1__1"
    // InternalOCLinEcore.g:24197:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
    public final void rule__PathNameCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24201:1: ( rule__PathNameCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:24202:2: rule__PathNameCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group_1__1"


    // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:24208:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
    public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24212:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:24213:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:24213:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
            // InternalOCLinEcore.g:24214:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }
            // InternalOCLinEcore.g:24215:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
            // InternalOCLinEcore.g:24215:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__PathNameCS__OwnedPathElementsAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__Group_1__1__Impl"


    // $ANTLR start "rule__TemplateBindingCS__Group__0"
    // InternalOCLinEcore.g:24231:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
    public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24235:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
            // InternalOCLinEcore.g:24236:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_124);
            rule__TemplateBindingCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__0"


    // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
    // InternalOCLinEcore.g:24243:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
    public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24247:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
            // InternalOCLinEcore.g:24248:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:24248:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
            // InternalOCLinEcore.g:24249:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
            }
            // InternalOCLinEcore.g:24250:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
            // InternalOCLinEcore.g:24250:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__0__Impl"


    // $ANTLR start "rule__TemplateBindingCS__Group__1"
    // InternalOCLinEcore.g:24260:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
    public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24264:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
            // InternalOCLinEcore.g:24265:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_124);
            rule__TemplateBindingCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__1"


    // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
    // InternalOCLinEcore.g:24272:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
    public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24276:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:24277:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:24277:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
            // InternalOCLinEcore.g:24278:1: ( rule__TemplateBindingCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:24279:1: ( rule__TemplateBindingCS__Group_1__0 )*
            loop237:
            do {
                int alt237=2;
                int LA237_0 = input.LA(1);

                if ( (LA237_0==105) ) {
                    alt237=1;
                }


                switch (alt237) {
            	case 1 :
            	    // InternalOCLinEcore.g:24279:2: rule__TemplateBindingCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TemplateBindingCS__Group_1__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__1__Impl"


    // $ANTLR start "rule__TemplateBindingCS__Group__2"
    // InternalOCLinEcore.g:24289:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
    public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24293:1: ( rule__TemplateBindingCS__Group__2__Impl )
            // InternalOCLinEcore.g:24294:2: rule__TemplateBindingCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__2"


    // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
    // InternalOCLinEcore.g:24300:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
    public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24304:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
            // InternalOCLinEcore.g:24305:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
            {
            // InternalOCLinEcore.g:24305:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
            // InternalOCLinEcore.g:24306:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
            }
            // InternalOCLinEcore.g:24307:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
            int alt238=2;
            int LA238_0 = input.LA(1);

            if ( (LA238_0==117) ) {
                alt238=1;
            }
            switch (alt238) {
                case 1 :
                    // InternalOCLinEcore.g:24307:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group__2__Impl"


    // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
    // InternalOCLinEcore.g:24323:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
    public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24327:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
            // InternalOCLinEcore.g:24328:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_84);
            rule__TemplateBindingCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group_1__0"


    // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:24335:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
    public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24339:1: ( ( ',' ) )
            // InternalOCLinEcore.g:24340:1: ( ',' )
            {
            // InternalOCLinEcore.g:24340:1: ( ',' )
            // InternalOCLinEcore.g:24341:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group_1__0__Impl"


    // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
    // InternalOCLinEcore.g:24354:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
    public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24358:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:24359:2: rule__TemplateBindingCS__Group_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group_1__1"


    // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:24365:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
    public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24369:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:24370:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:24370:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
            // InternalOCLinEcore.g:24371:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
            }
            // InternalOCLinEcore.g:24372:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
            // InternalOCLinEcore.g:24372:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__Group_1__1__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group__0"
    // InternalOCLinEcore.g:24386:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
    public final void rule__TypeParameterCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24390:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
            // InternalOCLinEcore.g:24391:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_125);
            rule__TypeParameterCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group__0"


    // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
    // InternalOCLinEcore.g:24398:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
    public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24402:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:24403:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:24403:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:24404:1: ( rule__TypeParameterCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:24405:1: ( rule__TypeParameterCS__NameAssignment_0 )
            // InternalOCLinEcore.g:24405:2: rule__TypeParameterCS__NameAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__NameAssignment_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group__0__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group__1"
    // InternalOCLinEcore.g:24415:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
    public final void rule__TypeParameterCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24419:1: ( rule__TypeParameterCS__Group__1__Impl )
            // InternalOCLinEcore.g:24420:2: rule__TypeParameterCS__Group__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group__1"


    // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
    // InternalOCLinEcore.g:24426:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
    public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24430:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:24431:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:24431:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
            // InternalOCLinEcore.g:24432:1: ( rule__TypeParameterCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:24433:1: ( rule__TypeParameterCS__Group_1__0 )?
            int alt239=2;
            int LA239_0 = input.LA(1);

            if ( (LA239_0==28) ) {
                alt239=1;
            }
            switch (alt239) {
                case 1 :
                    // InternalOCLinEcore.g:24433:2: rule__TypeParameterCS__Group_1__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__TypeParameterCS__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getGroup_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group__1__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group_1__0"
    // InternalOCLinEcore.g:24447:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
    public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24451:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
            // InternalOCLinEcore.g:24452:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__TypeParameterCS__Group_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group_1__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__0"


    // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
    // InternalOCLinEcore.g:24459:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
    public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24463:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:24464:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:24464:1: ( 'extends' )
            // InternalOCLinEcore.g:24465:1: 'extends'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
            }
            match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__0__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group_1__1"
    // InternalOCLinEcore.g:24478:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
    public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24482:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
            // InternalOCLinEcore.g:24483:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_126);
            rule__TypeParameterCS__Group_1__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group_1__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__1"


    // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
    // InternalOCLinEcore.g:24490:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
    public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24494:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:24495:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:24495:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
            // InternalOCLinEcore.g:24496:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
            }
            // InternalOCLinEcore.g:24497:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
            // InternalOCLinEcore.g:24497:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__OwnedExtendsAssignment_1_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__1__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group_1__2"
    // InternalOCLinEcore.g:24507:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
    public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24511:1: ( rule__TypeParameterCS__Group_1__2__Impl )
            // InternalOCLinEcore.g:24512:2: rule__TypeParameterCS__Group_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group_1__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__2"


    // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:24518:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
    public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24522:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
            // InternalOCLinEcore.g:24523:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
            {
            // InternalOCLinEcore.g:24523:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
            // InternalOCLinEcore.g:24524:1: ( rule__TypeParameterCS__Group_1_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
            }
            // InternalOCLinEcore.g:24525:1: ( rule__TypeParameterCS__Group_1_2__0 )*
            loop240:
            do {
                int alt240=2;
                int LA240_0 = input.LA(1);

                if ( (LA240_0==127) ) {
                    alt240=1;
                }


                switch (alt240) {
            	case 1 :
            	    // InternalOCLinEcore.g:24525:2: rule__TypeParameterCS__Group_1_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_127);
            	    rule__TypeParameterCS__Group_1_2__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1__2__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
    // InternalOCLinEcore.g:24541:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
    public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24545:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
            // InternalOCLinEcore.g:24546:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__TypeParameterCS__Group_1_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group_1_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1_2__0"


    // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
    // InternalOCLinEcore.g:24553:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
    public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24557:1: ( ( '&&' ) )
            // InternalOCLinEcore.g:24558:1: ( '&&' )
            {
            // InternalOCLinEcore.g:24558:1: ( '&&' )
            // InternalOCLinEcore.g:24559:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
            }
            match(input,127,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1_2__0__Impl"


    // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
    // InternalOCLinEcore.g:24572:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
    public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24576:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
            // InternalOCLinEcore.g:24577:2: rule__TypeParameterCS__Group_1_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__Group_1_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1_2__1"


    // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
    // InternalOCLinEcore.g:24583:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
    public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24587:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
            // InternalOCLinEcore.g:24588:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
            {
            // InternalOCLinEcore.g:24588:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
            // InternalOCLinEcore.g:24589:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
            }
            // InternalOCLinEcore.g:24590:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
            // InternalOCLinEcore.g:24590:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__Group_1_2__1__Impl"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
    // InternalOCLinEcore.g:24604:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
    public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24608:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
            // InternalOCLinEcore.g:24609:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_84);
            rule__WildcardTypeRefCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__0"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
    // InternalOCLinEcore.g:24616:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
    public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24620:1: ( ( () ) )
            // InternalOCLinEcore.g:24621:1: ( () )
            {
            // InternalOCLinEcore.g:24621:1: ( () )
            // InternalOCLinEcore.g:24622:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
            }
            // InternalOCLinEcore.g:24623:1: ()
            // InternalOCLinEcore.g:24625:1:
            {
            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
            }

            }


            }

        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__0__Impl"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
    // InternalOCLinEcore.g:24635:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
    public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24639:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
            // InternalOCLinEcore.g:24640:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_125);
            rule__WildcardTypeRefCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group__2();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__1"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
    // InternalOCLinEcore.g:24647:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
    public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24651:1: ( ( '?' ) )
            // InternalOCLinEcore.g:24652:1: ( '?' )
            {
            // InternalOCLinEcore.g:24652:1: ( '?' )
            // InternalOCLinEcore.g:24653:1: '?'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
            }
            match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__1__Impl"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
    // InternalOCLinEcore.g:24666:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
    public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24670:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
            // InternalOCLinEcore.g:24671:2: rule__WildcardTypeRefCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group__2__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__2"


    // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
    // InternalOCLinEcore.g:24677:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
    public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24681:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:24682:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:24682:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
            // InternalOCLinEcore.g:24683:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:24684:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
            int alt241=2;
            int LA241_0 = input.LA(1);

            if ( (LA241_0==28) ) {
                alt241=1;
            }
            switch (alt241) {
                case 1 :
                    // InternalOCLinEcore.g:24684:2: rule__WildcardTypeRefCS__Group_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__WildcardTypeRefCS__Group_2__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }
                    break;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group__2__Impl"


    // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
    // InternalOCLinEcore.g:24700:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
    public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24704:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
            // InternalOCLinEcore.g:24705:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            rule__WildcardTypeRefCS__Group_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group_2__1();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group_2__0"


    // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
    // InternalOCLinEcore.g:24712:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
    public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24716:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:24717:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:24717:1: ( 'extends' )
            // InternalOCLinEcore.g:24718:1: 'extends'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
            }
            match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group_2__0__Impl"


    // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
    // InternalOCLinEcore.g:24731:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
    public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24735:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:24736:2: rule__WildcardTypeRefCS__Group_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group_2__1"


    // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
    // InternalOCLinEcore.g:24742:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
    public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24746:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:24747:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:24747:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
            // InternalOCLinEcore.g:24748:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
            }
            // InternalOCLinEcore.g:24749:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
            // InternalOCLinEcore.g:24749:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__Group_2__1__Impl"


    // $ANTLR start "rule__TopLevelCS__OwnedImportsAssignment_2"
    // InternalOCLinEcore.g:24764:1: rule__TopLevelCS__OwnedImportsAssignment_2 : ( ruleImportCS ) ;
    public final void rule__TopLevelCS__OwnedImportsAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24768:1: ( ( ruleImportCS ) )
            // InternalOCLinEcore.g:24769:1: ( ruleImportCS )
            {
            // InternalOCLinEcore.g:24769:1: ( ruleImportCS )
            // InternalOCLinEcore.g:24770:1: ruleImportCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedImportsImportCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleImportCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getOwnedImportsImportCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__OwnedImportsAssignment_2"


    // $ANTLR start "rule__TopLevelCS__OwnedPackagesAssignment_3"
    // InternalOCLinEcore.g:24779:1: rule__TopLevelCS__OwnedPackagesAssignment_3 : ( rulePackageCS ) ;
    public final void rule__TopLevelCS__OwnedPackagesAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24783:1: ( ( rulePackageCS ) )
            // InternalOCLinEcore.g:24784:1: ( rulePackageCS )
            {
            // InternalOCLinEcore.g:24784:1: ( rulePackageCS )
            // InternalOCLinEcore.g:24785:1: rulePackageCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedPackagesPackageCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePackageCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTopLevelCSAccess().getOwnedPackagesPackageCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TopLevelCS__OwnedPackagesAssignment_3"


    // $ANTLR start "rule__InvariantConstraintCS__IsCallableAssignment_0"
    // InternalOCLinEcore.g:24794:1: rule__InvariantConstraintCS__IsCallableAssignment_0 : ( ( 'callable' ) ) ;
    public final void rule__InvariantConstraintCS__IsCallableAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24798:1: ( ( ( 'callable' ) ) )
            // InternalOCLinEcore.g:24799:1: ( ( 'callable' ) )
            {
            // InternalOCLinEcore.g:24799:1: ( ( 'callable' ) )
            // InternalOCLinEcore.g:24800:1: ( 'callable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
            }
            // InternalOCLinEcore.g:24801:1: ( 'callable' )
            // InternalOCLinEcore.g:24802:1: 'callable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
            }
            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__IsCallableAssignment_0"


    // $ANTLR start "rule__InvariantConstraintCS__StereotypeAssignment_1"
    // InternalOCLinEcore.g:24817:1: rule__InvariantConstraintCS__StereotypeAssignment_1 : ( ( 'invariant' ) ) ;
    public final void rule__InvariantConstraintCS__StereotypeAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24821:1: ( ( ( 'invariant' ) ) )
            // InternalOCLinEcore.g:24822:1: ( ( 'invariant' ) )
            {
            // InternalOCLinEcore.g:24822:1: ( ( 'invariant' ) )
            // InternalOCLinEcore.g:24823:1: ( 'invariant' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
            }
            // InternalOCLinEcore.g:24824:1: ( 'invariant' )
            // InternalOCLinEcore.g:24825:1: 'invariant'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
            }
            match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__StereotypeAssignment_1"


    // $ANTLR start "rule__InvariantConstraintCS__NameAssignment_2_0"
    // InternalOCLinEcore.g:24840:1: rule__InvariantConstraintCS__NameAssignment_2_0 : ( ruleUnrestrictedName ) ;
    public final void rule__InvariantConstraintCS__NameAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24844:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24845:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24845:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24846:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__NameAssignment_2_0"


    // $ANTLR start "rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1"
    // InternalOCLinEcore.g:24855:1: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 : ( ruleSpecificationCS ) ;
    public final void rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24859:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24860:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24860:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24861:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1"


    // $ANTLR start "rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1"
    // InternalOCLinEcore.g:24870:1: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 : ( ruleSpecificationCS ) ;
    public final void rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24874:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24875:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24875:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24876:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1"


    // $ANTLR start "rule__PostconditionConstraintCS__StereotypeAssignment_0"
    // InternalOCLinEcore.g:24885:1: rule__PostconditionConstraintCS__StereotypeAssignment_0 : ( ( 'postcondition' ) ) ;
    public final void rule__PostconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24889:1: ( ( ( 'postcondition' ) ) )
            // InternalOCLinEcore.g:24890:1: ( ( 'postcondition' ) )
            {
            // InternalOCLinEcore.g:24890:1: ( ( 'postcondition' ) )
            // InternalOCLinEcore.g:24891:1: ( 'postcondition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
            }
            // InternalOCLinEcore.g:24892:1: ( 'postcondition' )
            // InternalOCLinEcore.g:24893:1: 'postcondition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
            }
            match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__StereotypeAssignment_0"


    // $ANTLR start "rule__PostconditionConstraintCS__NameAssignment_1_0"
    // InternalOCLinEcore.g:24908:1: rule__PostconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
    public final void rule__PostconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24912:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24913:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24913:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24914:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__NameAssignment_1_0"


    // $ANTLR start "rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"
    // InternalOCLinEcore.g:24923:1: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
    public final void rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24927:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24928:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24928:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24929:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"


    // $ANTLR start "rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3"
    // InternalOCLinEcore.g:24938:1: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
    public final void rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24942:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24943:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24943:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24944:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3"


    // $ANTLR start "rule__PreconditionConstraintCS__StereotypeAssignment_0"
    // InternalOCLinEcore.g:24953:1: rule__PreconditionConstraintCS__StereotypeAssignment_0 : ( ( 'precondition' ) ) ;
    public final void rule__PreconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24957:1: ( ( ( 'precondition' ) ) )
            // InternalOCLinEcore.g:24958:1: ( ( 'precondition' ) )
            {
            // InternalOCLinEcore.g:24958:1: ( ( 'precondition' ) )
            // InternalOCLinEcore.g:24959:1: ( 'precondition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
            }
            // InternalOCLinEcore.g:24960:1: ( 'precondition' )
            // InternalOCLinEcore.g:24961:1: 'precondition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
            }
            match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__StereotypeAssignment_0"


    // $ANTLR start "rule__PreconditionConstraintCS__NameAssignment_1_0"
    // InternalOCLinEcore.g:24976:1: rule__PreconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
    public final void rule__PreconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24980:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24981:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24981:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24982:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__NameAssignment_1_0"


    // $ANTLR start "rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"
    // InternalOCLinEcore.g:24991:1: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
    public final void rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24995:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24996:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24996:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24997:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"


    // $ANTLR start "rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3"
    // InternalOCLinEcore.g:25006:1: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
    public final void rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25010:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:25011:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:25011:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:25012:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3"


    // $ANTLR start "rule__AnnotationCS__NameAssignment_2"
    // InternalOCLinEcore.g:25021:1: rule__AnnotationCS__NameAssignment_2 : ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) ;
    public final void rule__AnnotationCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25025:1: ( ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) )
            // InternalOCLinEcore.g:25026:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
            {
            // InternalOCLinEcore.g:25026:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
            // InternalOCLinEcore.g:25027:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getNameAlternatives_2_0());
            }
            // InternalOCLinEcore.g:25028:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
            // InternalOCLinEcore.g:25028:2: rule__AnnotationCS__NameAlternatives_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__AnnotationCS__NameAlternatives_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getNameAlternatives_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__NameAssignment_2"


    // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_3_1"
    // InternalOCLinEcore.g:25037:1: rule__AnnotationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
    public final void rule__AnnotationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25041:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:25042:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:25042:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:25043:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__OwnedDetailsAssignment_3_1"


    // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_3_2_1"
    // InternalOCLinEcore.g:25052:1: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
    public final void rule__AnnotationCS__OwnedDetailsAssignment_3_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25056:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:25057:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:25057:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:25058:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__OwnedDetailsAssignment_3_2_1"


    // $ANTLR start "rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0"
    // InternalOCLinEcore.g:25067:1: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25071:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25072:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25072:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25073:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0"


    // $ANTLR start "rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1"
    // InternalOCLinEcore.g:25082:1: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 : ( ruleModelElementCS ) ;
    public final void rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25086:1: ( ( ruleModelElementCS ) )
            // InternalOCLinEcore.g:25087:1: ( ruleModelElementCS )
            {
            // InternalOCLinEcore.g:25087:1: ( ruleModelElementCS )
            // InternalOCLinEcore.g:25088:1: ruleModelElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedContentsModelElementCSParserRuleCall_4_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleModelElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedContentsModelElementCSParserRuleCall_4_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1"


    // $ANTLR start "rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2"
    // InternalOCLinEcore.g:25097:1: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 : ( ruleModelElementRefCS ) ;
    public final void rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25101:1: ( ( ruleModelElementRefCS ) )
            // InternalOCLinEcore.g:25102:1: ( ruleModelElementRefCS )
            {
            // InternalOCLinEcore.g:25102:1: ( ruleModelElementRefCS )
            // InternalOCLinEcore.g:25103:1: ruleModelElementRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedReferencesModelElementRefCSParserRuleCall_4_0_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleModelElementRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAnnotationCSAccess().getOwnedReferencesModelElementRefCSParserRuleCall_4_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_0_0"
    // InternalOCLinEcore.g:25112:1: rule__AttributeCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_0_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25116:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:25117:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:25117:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:25118:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:25119:1: ( 'static' )
            // InternalOCLinEcore.g:25120:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_0_0_0"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_0_1"
    // InternalOCLinEcore.g:25135:1: rule__AttributeCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_0_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25139:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:25140:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:25140:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:25141:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:25142:1: ( 'definition' )
            // InternalOCLinEcore.g:25143:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_0_0_1"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_1_0"
    // InternalOCLinEcore.g:25158:1: rule__AttributeCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25162:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:25163:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:25163:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:25164:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:25165:1: ( 'definition' )
            // InternalOCLinEcore.g:25166:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_0_1_0"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_1_1"
    // InternalOCLinEcore.g:25181:1: rule__AttributeCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25185:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:25186:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:25186:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:25187:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:25188:1: ( 'static' )
            // InternalOCLinEcore.g:25189:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_0_1_1"


    // $ANTLR start "rule__AttributeCS__NameAssignment_2"
    // InternalOCLinEcore.g:25204:1: rule__AttributeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__AttributeCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25208:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25209:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25209:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25210:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__NameAssignment_2"


    // $ANTLR start "rule__AttributeCS__OwnedTypeAssignment_3_1"
    // InternalOCLinEcore.g:25219:1: rule__AttributeCS__OwnedTypeAssignment_3_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__AttributeCS__OwnedTypeAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25223:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:25224:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:25224:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:25225:1: ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__OwnedTypeAssignment_3_1"


    // $ANTLR start "rule__AttributeCS__DefaultAssignment_4_1"
    // InternalOCLinEcore.g:25234:1: rule__AttributeCS__DefaultAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__AttributeCS__DefaultAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25238:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25239:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25239:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25240:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__DefaultAssignment_4_1"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_0"
    // InternalOCLinEcore.g:25249:1: rule__AttributeCS__QualifiersAssignment_5_1_0_0 : ( ( 'derived' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25253:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:25254:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:25254:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:25255:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
            }
            // InternalOCLinEcore.g:25256:1: ( 'derived' )
            // InternalOCLinEcore.g:25257:1: 'derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
            }
            match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_0"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_1"
    // InternalOCLinEcore.g:25272:1: rule__AttributeCS__QualifiersAssignment_5_1_0_1 : ( ( '!derived' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25276:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:25277:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:25277:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:25278:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }
            // InternalOCLinEcore.g:25279:1: ( '!derived' )
            // InternalOCLinEcore.g:25280:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }
            match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_1"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_2"
    // InternalOCLinEcore.g:25295:1: rule__AttributeCS__QualifiersAssignment_5_1_0_2 : ( ( 'id' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25299:1: ( ( ( 'id' ) ) )
            // InternalOCLinEcore.g:25300:1: ( ( 'id' ) )
            {
            // InternalOCLinEcore.g:25300:1: ( ( 'id' ) )
            // InternalOCLinEcore.g:25301:1: ( 'id' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
            }
            // InternalOCLinEcore.g:25302:1: ( 'id' )
            // InternalOCLinEcore.g:25303:1: 'id'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
            }
            match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_2"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_3"
    // InternalOCLinEcore.g:25318:1: rule__AttributeCS__QualifiersAssignment_5_1_0_3 : ( ( '!id' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25322:1: ( ( ( '!id' ) ) )
            // InternalOCLinEcore.g:25323:1: ( ( '!id' ) )
            {
            // InternalOCLinEcore.g:25323:1: ( ( '!id' ) )
            // InternalOCLinEcore.g:25324:1: ( '!id' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }
            // InternalOCLinEcore.g:25325:1: ( '!id' )
            // InternalOCLinEcore.g:25326:1: '!id'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }
            match(input,129,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_3"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_4"
    // InternalOCLinEcore.g:25341:1: rule__AttributeCS__QualifiersAssignment_5_1_0_4 : ( ( 'ordered' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25345:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:25346:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:25346:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:25347:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
            }
            // InternalOCLinEcore.g:25348:1: ( 'ordered' )
            // InternalOCLinEcore.g:25349:1: 'ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
            }
            match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_4"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_5"
    // InternalOCLinEcore.g:25364:1: rule__AttributeCS__QualifiersAssignment_5_1_0_5 : ( ( '!ordered' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25368:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:25369:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:25369:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:25370:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }
            // InternalOCLinEcore.g:25371:1: ( '!ordered' )
            // InternalOCLinEcore.g:25372:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }
            match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_5"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_6"
    // InternalOCLinEcore.g:25387:1: rule__AttributeCS__QualifiersAssignment_5_1_0_6 : ( ( 'readonly' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25391:1: ( ( ( 'readonly' ) ) )
            // InternalOCLinEcore.g:25392:1: ( ( 'readonly' ) )
            {
            // InternalOCLinEcore.g:25392:1: ( ( 'readonly' ) )
            // InternalOCLinEcore.g:25393:1: ( 'readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
            }
            // InternalOCLinEcore.g:25394:1: ( 'readonly' )
            // InternalOCLinEcore.g:25395:1: 'readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
            }
            match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_6"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_7"
    // InternalOCLinEcore.g:25410:1: rule__AttributeCS__QualifiersAssignment_5_1_0_7 : ( ( '!readonly' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25414:1: ( ( ( '!readonly' ) ) )
            // InternalOCLinEcore.g:25415:1: ( ( '!readonly' ) )
            {
            // InternalOCLinEcore.g:25415:1: ( ( '!readonly' ) )
            // InternalOCLinEcore.g:25416:1: ( '!readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }
            // InternalOCLinEcore.g:25417:1: ( '!readonly' )
            // InternalOCLinEcore.g:25418:1: '!readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }
            match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_7"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_8"
    // InternalOCLinEcore.g:25433:1: rule__AttributeCS__QualifiersAssignment_5_1_0_8 : ( ( 'transient' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_8() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25437:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:25438:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:25438:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:25439:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
            }
            // InternalOCLinEcore.g:25440:1: ( 'transient' )
            // InternalOCLinEcore.g:25441:1: 'transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
            }
            match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_8"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_9"
    // InternalOCLinEcore.g:25456:1: rule__AttributeCS__QualifiersAssignment_5_1_0_9 : ( ( '!transient' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_9() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25460:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:25461:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:25461:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:25462:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }
            // InternalOCLinEcore.g:25463:1: ( '!transient' )
            // InternalOCLinEcore.g:25464:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }
            match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_9"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_10"
    // InternalOCLinEcore.g:25479:1: rule__AttributeCS__QualifiersAssignment_5_1_0_10 : ( ( 'unique' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_10() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25483:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:25484:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:25484:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:25485:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
            }
            // InternalOCLinEcore.g:25486:1: ( 'unique' )
            // InternalOCLinEcore.g:25487:1: 'unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
            }
            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_10"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_11"
    // InternalOCLinEcore.g:25502:1: rule__AttributeCS__QualifiersAssignment_5_1_0_11 : ( ( '!unique' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_11() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25506:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:25507:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:25507:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:25508:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }
            // InternalOCLinEcore.g:25509:1: ( '!unique' )
            // InternalOCLinEcore.g:25510:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }
            match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_11"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_12"
    // InternalOCLinEcore.g:25525:1: rule__AttributeCS__QualifiersAssignment_5_1_0_12 : ( ( 'unsettable' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_12() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25529:1: ( ( ( 'unsettable' ) ) )
            // InternalOCLinEcore.g:25530:1: ( ( 'unsettable' ) )
            {
            // InternalOCLinEcore.g:25530:1: ( ( 'unsettable' ) )
            // InternalOCLinEcore.g:25531:1: ( 'unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
            }
            // InternalOCLinEcore.g:25532:1: ( 'unsettable' )
            // InternalOCLinEcore.g:25533:1: 'unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
            }
            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_12"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_13"
    // InternalOCLinEcore.g:25548:1: rule__AttributeCS__QualifiersAssignment_5_1_0_13 : ( ( '!unsettable' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_13() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25552:1: ( ( ( '!unsettable' ) ) )
            // InternalOCLinEcore.g:25553:1: ( ( '!unsettable' ) )
            {
            // InternalOCLinEcore.g:25553:1: ( ( '!unsettable' ) )
            // InternalOCLinEcore.g:25554:1: ( '!unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }
            // InternalOCLinEcore.g:25555:1: ( '!unsettable' )
            // InternalOCLinEcore.g:25556:1: '!unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }
            match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_13"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_14"
    // InternalOCLinEcore.g:25571:1: rule__AttributeCS__QualifiersAssignment_5_1_0_14 : ( ( 'volatile' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_14() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25575:1: ( ( ( 'volatile' ) ) )
            // InternalOCLinEcore.g:25576:1: ( ( 'volatile' ) )
            {
            // InternalOCLinEcore.g:25576:1: ( ( 'volatile' ) )
            // InternalOCLinEcore.g:25577:1: ( 'volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
            }
            // InternalOCLinEcore.g:25578:1: ( 'volatile' )
            // InternalOCLinEcore.g:25579:1: 'volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
            }
            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_14"


    // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_15"
    // InternalOCLinEcore.g:25594:1: rule__AttributeCS__QualifiersAssignment_5_1_0_15 : ( ( '!volatile' ) ) ;
    public final void rule__AttributeCS__QualifiersAssignment_5_1_0_15() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25598:1: ( ( ( '!volatile' ) ) )
            // InternalOCLinEcore.g:25599:1: ( ( '!volatile' ) )
            {
            // InternalOCLinEcore.g:25599:1: ( ( '!volatile' ) )
            // InternalOCLinEcore.g:25600:1: ( '!volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }
            // InternalOCLinEcore.g:25601:1: ( '!volatile' )
            // InternalOCLinEcore.g:25602:1: '!volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }
            match(input,135,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__QualifiersAssignment_5_1_0_15"


    // $ANTLR start "rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0"
    // InternalOCLinEcore.g:25617:1: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25621:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25622:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25622:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25623:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0"


    // $ANTLR start "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3"
    // InternalOCLinEcore.g:25632:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 : ( ruleSpecificationCS ) ;
    public final void rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25636:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:25637:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:25637:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:25638:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3"


    // $ANTLR start "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3"
    // InternalOCLinEcore.g:25647:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 : ( ruleSpecificationCS ) ;
    public final void rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25651:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:25652:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:25652:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:25653:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_2_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_2_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3"


    // $ANTLR start "rule__DataTypeCS__IsPrimitiveAssignment_0"
    // InternalOCLinEcore.g:25662:1: rule__DataTypeCS__IsPrimitiveAssignment_0 : ( ( 'primitive' ) ) ;
    public final void rule__DataTypeCS__IsPrimitiveAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25666:1: ( ( ( 'primitive' ) ) )
            // InternalOCLinEcore.g:25667:1: ( ( 'primitive' ) )
            {
            // InternalOCLinEcore.g:25667:1: ( ( 'primitive' ) )
            // InternalOCLinEcore.g:25668:1: ( 'primitive' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
            }
            // InternalOCLinEcore.g:25669:1: ( 'primitive' )
            // InternalOCLinEcore.g:25670:1: 'primitive'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
            }
            match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__IsPrimitiveAssignment_0"


    // $ANTLR start "rule__DataTypeCS__NameAssignment_2"
    // InternalOCLinEcore.g:25685:1: rule__DataTypeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__DataTypeCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25689:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25690:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25690:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25691:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__NameAssignment_2"


    // $ANTLR start "rule__DataTypeCS__OwnedSignatureAssignment_3"
    // InternalOCLinEcore.g:25700:1: rule__DataTypeCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
    public final void rule__DataTypeCS__OwnedSignatureAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25704:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:25705:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:25705:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:25706:1: ruleTemplateSignatureCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__OwnedSignatureAssignment_3"


    // $ANTLR start "rule__DataTypeCS__InstanceClassNameAssignment_4_1"
    // InternalOCLinEcore.g:25715:1: rule__DataTypeCS__InstanceClassNameAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__DataTypeCS__InstanceClassNameAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25719:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25720:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25720:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25721:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__InstanceClassNameAssignment_4_1"


    // $ANTLR start "rule__DataTypeCS__IsSerializableAssignment_5_1_0"
    // InternalOCLinEcore.g:25730:1: rule__DataTypeCS__IsSerializableAssignment_5_1_0 : ( ( 'serializable' ) ) ;
    public final void rule__DataTypeCS__IsSerializableAssignment_5_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25734:1: ( ( ( 'serializable' ) ) )
            // InternalOCLinEcore.g:25735:1: ( ( 'serializable' ) )
            {
            // InternalOCLinEcore.g:25735:1: ( ( 'serializable' ) )
            // InternalOCLinEcore.g:25736:1: ( 'serializable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }
            // InternalOCLinEcore.g:25737:1: ( 'serializable' )
            // InternalOCLinEcore.g:25738:1: 'serializable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }
            match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__IsSerializableAssignment_5_1_0"


    // $ANTLR start "rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0"
    // InternalOCLinEcore.g:25753:1: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25757:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25758:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25758:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25759:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0"


    // $ANTLR start "rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1"
    // InternalOCLinEcore.g:25768:1: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 : ( ruleInvariantConstraintCS ) ;
    public final void rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25772:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:25773:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:25773:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:25774:1: ruleInvariantConstraintCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_6_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleInvariantConstraintCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_6_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1"


    // $ANTLR start "rule__DetailCS__NameAssignment_0"
    // InternalOCLinEcore.g:25783:1: rule__DetailCS__NameAssignment_0 : ( ( rule__DetailCS__NameAlternatives_0_0 ) ) ;
    public final void rule__DetailCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25787:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
            // InternalOCLinEcore.g:25788:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
            {
            // InternalOCLinEcore.g:25788:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
            // InternalOCLinEcore.g:25789:1: ( rule__DetailCS__NameAlternatives_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getNameAlternatives_0_0());
            }
            // InternalOCLinEcore.g:25790:1: ( rule__DetailCS__NameAlternatives_0_0 )
            // InternalOCLinEcore.g:25790:2: rule__DetailCS__NameAlternatives_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__NameAlternatives_0_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getNameAlternatives_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__NameAssignment_0"


    // $ANTLR start "rule__DetailCS__ValuesAssignment_2"
    // InternalOCLinEcore.g:25799:1: rule__DetailCS__ValuesAssignment_2 : ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) ;
    public final void rule__DetailCS__ValuesAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25803:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
            // InternalOCLinEcore.g:25804:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
            {
            // InternalOCLinEcore.g:25804:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
            // InternalOCLinEcore.g:25805:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getValuesAlternatives_2_0());
            }
            // InternalOCLinEcore.g:25806:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
            // InternalOCLinEcore.g:25806:2: rule__DetailCS__ValuesAlternatives_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__DetailCS__ValuesAlternatives_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getDetailCSAccess().getValuesAlternatives_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DetailCS__ValuesAssignment_2"


    // $ANTLR start "rule__DocumentationCS__ValueAssignment_2"
    // InternalOCLinEcore.g:25815:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__DocumentationCS__ValueAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25819:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25820:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25820:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25821:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getValueSINGLE_QUOTED_STRINGTerminalRuleCall_2_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getValueSINGLE_QUOTED_STRINGTerminalRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__ValueAssignment_2"


    // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_1"
    // InternalOCLinEcore.g:25830:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
    public final void rule__DocumentationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25834:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:25835:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:25835:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:25836:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__OwnedDetailsAssignment_3_1"


    // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_2_1"
    // InternalOCLinEcore.g:25845:1: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
    public final void rule__DocumentationCS__OwnedDetailsAssignment_3_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25849:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:25850:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:25850:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:25851:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__DocumentationCS__OwnedDetailsAssignment_3_2_1"


    // $ANTLR start "rule__EnumerationCS__NameAssignment_1"
    // InternalOCLinEcore.g:25860:1: rule__EnumerationCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
    public final void rule__EnumerationCS__NameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25864:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25865:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25865:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25866:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__NameAssignment_1"


    // $ANTLR start "rule__EnumerationCS__OwnedSignatureAssignment_2"
    // InternalOCLinEcore.g:25875:1: rule__EnumerationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
    public final void rule__EnumerationCS__OwnedSignatureAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25879:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:25880:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:25880:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:25881:1: ruleTemplateSignatureCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__OwnedSignatureAssignment_2"


    // $ANTLR start "rule__EnumerationCS__InstanceClassNameAssignment_3_1"
    // InternalOCLinEcore.g:25890:1: rule__EnumerationCS__InstanceClassNameAssignment_3_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__EnumerationCS__InstanceClassNameAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25894:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25895:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25895:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25896:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_3_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__InstanceClassNameAssignment_3_1"


    // $ANTLR start "rule__EnumerationCS__IsSerializableAssignment_4_1_0"
    // InternalOCLinEcore.g:25905:1: rule__EnumerationCS__IsSerializableAssignment_4_1_0 : ( ( 'serializable' ) ) ;
    public final void rule__EnumerationCS__IsSerializableAssignment_4_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25909:1: ( ( ( 'serializable' ) ) )
            // InternalOCLinEcore.g:25910:1: ( ( 'serializable' ) )
            {
            // InternalOCLinEcore.g:25910:1: ( ( 'serializable' ) )
            // InternalOCLinEcore.g:25911:1: ( 'serializable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }
            // InternalOCLinEcore.g:25912:1: ( 'serializable' )
            // InternalOCLinEcore.g:25913:1: 'serializable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }
            match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__IsSerializableAssignment_4_1_0"


    // $ANTLR start "rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0"
    // InternalOCLinEcore.g:25928:1: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25932:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25933:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25933:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25934:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_5_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_5_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0"


    // $ANTLR start "rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1"
    // InternalOCLinEcore.g:25943:1: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 : ( ruleEnumerationLiteralCS ) ;
    public final void rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25947:1: ( ( ruleEnumerationLiteralCS ) )
            // InternalOCLinEcore.g:25948:1: ( ruleEnumerationLiteralCS )
            {
            // InternalOCLinEcore.g:25948:1: ( ruleEnumerationLiteralCS )
            // InternalOCLinEcore.g:25949:1: ruleEnumerationLiteralCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEnumerationLiteralCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1"


    // $ANTLR start "rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2"
    // InternalOCLinEcore.g:25958:1: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 : ( ruleInvariantConstraintCS ) ;
    public final void rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25962:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:25963:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:25963:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:25964:1: ruleInvariantConstraintCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_5_0_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleInvariantConstraintCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_5_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2"


    // $ANTLR start "rule__EnumerationLiteralCS__NameAssignment_0_0_1"
    // InternalOCLinEcore.g:25973:1: rule__EnumerationLiteralCS__NameAssignment_0_0_1 : ( ruleUnrestrictedName ) ;
    public final void rule__EnumerationLiteralCS__NameAssignment_0_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25977:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25978:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25978:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25979:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__NameAssignment_0_0_1"


    // $ANTLR start "rule__EnumerationLiteralCS__NameAssignment_0_1"
    // InternalOCLinEcore.g:25988:1: rule__EnumerationLiteralCS__NameAssignment_0_1 : ( ruleEnumerationLiteralName ) ;
    public final void rule__EnumerationLiteralCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25992:1: ( ( ruleEnumerationLiteralName ) )
            // InternalOCLinEcore.g:25993:1: ( ruleEnumerationLiteralName )
            {
            // InternalOCLinEcore.g:25993:1: ( ruleEnumerationLiteralName )
            // InternalOCLinEcore.g:25994:1: ruleEnumerationLiteralName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleEnumerationLiteralName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__NameAssignment_0_1"


    // $ANTLR start "rule__EnumerationLiteralCS__LiteralAssignment_1_1"
    // InternalOCLinEcore.g:26003:1: rule__EnumerationLiteralCS__LiteralAssignment_1_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__EnumerationLiteralCS__LiteralAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26007:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:26008:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:26008:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:26009:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralSINGLE_QUOTED_STRINGTerminalRuleCall_1_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getLiteralSINGLE_QUOTED_STRINGTerminalRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__LiteralAssignment_1_1"


    // $ANTLR start "rule__EnumerationLiteralCS__ValueAssignment_2_1"
    // InternalOCLinEcore.g:26018:1: rule__EnumerationLiteralCS__ValueAssignment_2_1 : ( ruleSIGNED ) ;
    public final void rule__EnumerationLiteralCS__ValueAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26022:1: ( ( ruleSIGNED ) )
            // InternalOCLinEcore.g:26023:1: ( ruleSIGNED )
            {
            // InternalOCLinEcore.g:26023:1: ( ruleSIGNED )
            // InternalOCLinEcore.g:26024:1: ruleSIGNED
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSIGNED();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__ValueAssignment_2_1"


    // $ANTLR start "rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1"
    // InternalOCLinEcore.g:26033:1: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 : ( ruleAnnotationElementCS ) ;
    public final void rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26037:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:26038:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:26038:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:26039:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1"


    // $ANTLR start "rule__ImportCS__NameAssignment_1_0"
    // InternalOCLinEcore.g:26048:1: rule__ImportCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
    public final void rule__ImportCS__NameAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26052:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26053:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26053:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26054:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__NameAssignment_1_0"


    // $ANTLR start "rule__ImportCS__OwnedPathNameAssignment_2"
    // InternalOCLinEcore.g:26063:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
    public final void rule__ImportCS__OwnedPathNameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26067:1: ( ( ruleURIPathNameCS ) )
            // InternalOCLinEcore.g:26068:1: ( ruleURIPathNameCS )
            {
            // InternalOCLinEcore.g:26068:1: ( ruleURIPathNameCS )
            // InternalOCLinEcore.g:26069:1: ruleURIPathNameCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleURIPathNameCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__OwnedPathNameAssignment_2"


    // $ANTLR start "rule__ImportCS__IsAllAssignment_3"
    // InternalOCLinEcore.g:26078:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
    public final void rule__ImportCS__IsAllAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26082:1: ( ( ( '::*' ) ) )
            // InternalOCLinEcore.g:26083:1: ( ( '::*' ) )
            {
            // InternalOCLinEcore.g:26083:1: ( ( '::*' ) )
            // InternalOCLinEcore.g:26084:1: ( '::*' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }
            // InternalOCLinEcore.g:26085:1: ( '::*' )
            // InternalOCLinEcore.g:26086:1: '::*'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }
            match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImportCS__IsAllAssignment_3"


    // $ANTLR start "rule__ModelElementRefCS__OwnedPathNameAssignment_1"
    // InternalOCLinEcore.g:26101:1: rule__ModelElementRefCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
    public final void rule__ModelElementRefCS__OwnedPathNameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26105:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:26106:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:26106:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:26107:1: rulePathNameCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePathNameCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getModelElementRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ModelElementRefCS__OwnedPathNameAssignment_1"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_0_0"
    // InternalOCLinEcore.g:26116:1: rule__OperationCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_0_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26120:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:26121:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:26121:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:26122:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:26123:1: ( 'static' )
            // InternalOCLinEcore.g:26124:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_0_0_0"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_0_1"
    // InternalOCLinEcore.g:26139:1: rule__OperationCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_0_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26143:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:26144:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:26144:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:26145:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:26146:1: ( 'definition' )
            // InternalOCLinEcore.g:26147:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_0_0_1"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_1_0"
    // InternalOCLinEcore.g:26162:1: rule__OperationCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26166:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:26167:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:26167:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:26168:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:26169:1: ( 'definition' )
            // InternalOCLinEcore.g:26170:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_0_1_0"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_1_1"
    // InternalOCLinEcore.g:26185:1: rule__OperationCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26189:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:26190:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:26190:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:26191:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:26192:1: ( 'static' )
            // InternalOCLinEcore.g:26193:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_0_1_1"


    // $ANTLR start "rule__OperationCS__OwnedSignatureAssignment_2"
    // InternalOCLinEcore.g:26208:1: rule__OperationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
    public final void rule__OperationCS__OwnedSignatureAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26212:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:26213:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:26213:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:26214:1: ruleTemplateSignatureCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedSignatureAssignment_2"


    // $ANTLR start "rule__OperationCS__NameAssignment_3"
    // InternalOCLinEcore.g:26223:1: rule__OperationCS__NameAssignment_3 : ( ruleUnrestrictedName ) ;
    public final void rule__OperationCS__NameAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26227:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26228:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26228:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26229:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__NameAssignment_3"


    // $ANTLR start "rule__OperationCS__OwnedParametersAssignment_5_0"
    // InternalOCLinEcore.g:26238:1: rule__OperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
    public final void rule__OperationCS__OwnedParametersAssignment_5_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26242:1: ( ( ruleParameterCS ) )
            // InternalOCLinEcore.g:26243:1: ( ruleParameterCS )
            {
            // InternalOCLinEcore.g:26243:1: ( ruleParameterCS )
            // InternalOCLinEcore.g:26244:1: ruleParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedParametersAssignment_5_0"


    // $ANTLR start "rule__OperationCS__OwnedParametersAssignment_5_1_1"
    // InternalOCLinEcore.g:26253:1: rule__OperationCS__OwnedParametersAssignment_5_1_1 : ( ruleParameterCS ) ;
    public final void rule__OperationCS__OwnedParametersAssignment_5_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26257:1: ( ( ruleParameterCS ) )
            // InternalOCLinEcore.g:26258:1: ( ruleParameterCS )
            {
            // InternalOCLinEcore.g:26258:1: ( ruleParameterCS )
            // InternalOCLinEcore.g:26259:1: ruleParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedParametersAssignment_5_1_1"


    // $ANTLR start "rule__OperationCS__OwnedTypeAssignment_7_1"
    // InternalOCLinEcore.g:26268:1: rule__OperationCS__OwnedTypeAssignment_7_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__OperationCS__OwnedTypeAssignment_7_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26272:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:26273:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:26273:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:26274:1: ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedTypeAssignment_7_1"


    // $ANTLR start "rule__OperationCS__OwnedExceptionsAssignment_8_1"
    // InternalOCLinEcore.g:26283:1: rule__OperationCS__OwnedExceptionsAssignment_8_1 : ( ruleTypedRefCS ) ;
    public final void rule__OperationCS__OwnedExceptionsAssignment_8_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26287:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:26288:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:26288:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:26289:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedExceptionsAssignment_8_1"


    // $ANTLR start "rule__OperationCS__OwnedExceptionsAssignment_8_2_1"
    // InternalOCLinEcore.g:26298:1: rule__OperationCS__OwnedExceptionsAssignment_8_2_1 : ( ruleTypedRefCS ) ;
    public final void rule__OperationCS__OwnedExceptionsAssignment_8_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26302:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:26303:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:26303:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:26304:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedExceptionsAssignment_8_2_1"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_0"
    // InternalOCLinEcore.g:26313:1: rule__OperationCS__QualifiersAssignment_9_1_0_0 : ( ( 'derived' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26317:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:26318:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:26318:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:26319:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
            }
            // InternalOCLinEcore.g:26320:1: ( 'derived' )
            // InternalOCLinEcore.g:26321:1: 'derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
            }
            match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_0"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_1"
    // InternalOCLinEcore.g:26336:1: rule__OperationCS__QualifiersAssignment_9_1_0_1 : ( ( '!derived' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26340:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:26341:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:26341:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:26342:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }
            // InternalOCLinEcore.g:26343:1: ( '!derived' )
            // InternalOCLinEcore.g:26344:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }
            match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_1"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_2"
    // InternalOCLinEcore.g:26359:1: rule__OperationCS__QualifiersAssignment_9_1_0_2 : ( ( 'ordered' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26363:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:26364:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:26364:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:26365:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
            }
            // InternalOCLinEcore.g:26366:1: ( 'ordered' )
            // InternalOCLinEcore.g:26367:1: 'ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
            }
            match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_2"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_3"
    // InternalOCLinEcore.g:26382:1: rule__OperationCS__QualifiersAssignment_9_1_0_3 : ( ( '!ordered' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26386:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:26387:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:26387:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:26388:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }
            // InternalOCLinEcore.g:26389:1: ( '!ordered' )
            // InternalOCLinEcore.g:26390:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }
            match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_3"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_4"
    // InternalOCLinEcore.g:26405:1: rule__OperationCS__QualifiersAssignment_9_1_0_4 : ( ( 'transient' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26409:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:26410:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:26410:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:26411:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
            }
            // InternalOCLinEcore.g:26412:1: ( 'transient' )
            // InternalOCLinEcore.g:26413:1: 'transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
            }
            match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_4"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_5"
    // InternalOCLinEcore.g:26428:1: rule__OperationCS__QualifiersAssignment_9_1_0_5 : ( ( '!transient' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26432:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:26433:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:26433:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:26434:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }
            // InternalOCLinEcore.g:26435:1: ( '!transient' )
            // InternalOCLinEcore.g:26436:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }
            match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_5"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_6"
    // InternalOCLinEcore.g:26451:1: rule__OperationCS__QualifiersAssignment_9_1_0_6 : ( ( 'unique' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26455:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:26456:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:26456:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:26457:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
            }
            // InternalOCLinEcore.g:26458:1: ( 'unique' )
            // InternalOCLinEcore.g:26459:1: 'unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
            }
            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_6"


    // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_7"
    // InternalOCLinEcore.g:26474:1: rule__OperationCS__QualifiersAssignment_9_1_0_7 : ( ( '!unique' ) ) ;
    public final void rule__OperationCS__QualifiersAssignment_9_1_0_7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26478:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:26479:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:26479:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:26480:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }
            // InternalOCLinEcore.g:26481:1: ( '!unique' )
            // InternalOCLinEcore.g:26482:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }
            match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__QualifiersAssignment_9_1_0_7"


    // $ANTLR start "rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0"
    // InternalOCLinEcore.g:26497:1: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26501:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:26502:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:26502:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:26503:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_10_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_10_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0"


    // $ANTLR start "rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1"
    // InternalOCLinEcore.g:26512:1: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 : ( rulePreconditionConstraintCS ) ;
    public final void rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26516:1: ( ( rulePreconditionConstraintCS ) )
            // InternalOCLinEcore.g:26517:1: ( rulePreconditionConstraintCS )
            {
            // InternalOCLinEcore.g:26517:1: ( rulePreconditionConstraintCS )
            // InternalOCLinEcore.g:26518:1: rulePreconditionConstraintCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedPreconditionsPreconditionConstraintCSParserRuleCall_10_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePreconditionConstraintCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedPreconditionsPreconditionConstraintCSParserRuleCall_10_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1"


    // $ANTLR start "rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3"
    // InternalOCLinEcore.g:26527:1: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 : ( ruleSpecificationCS ) ;
    public final void rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26531:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:26532:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:26532:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:26533:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_2_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_2_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3"


    // $ANTLR start "rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3"
    // InternalOCLinEcore.g:26542:1: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 : ( rulePostconditionConstraintCS ) ;
    public final void rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26546:1: ( ( rulePostconditionConstraintCS ) )
            // InternalOCLinEcore.g:26547:1: ( rulePostconditionConstraintCS )
            {
            // InternalOCLinEcore.g:26547:1: ( rulePostconditionConstraintCS )
            // InternalOCLinEcore.g:26548:1: rulePostconditionConstraintCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedPostconditionsPostconditionConstraintCSParserRuleCall_10_0_1_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePostconditionConstraintCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOperationCSAccess().getOwnedPostconditionsPostconditionConstraintCSParserRuleCall_10_0_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3"


    // $ANTLR start "rule__PackageCS__NameAssignment_1"
    // InternalOCLinEcore.g:26557:1: rule__PackageCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
    public final void rule__PackageCS__NameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26561:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26562:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26562:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26563:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__NameAssignment_1"


    // $ANTLR start "rule__PackageCS__NsPrefixAssignment_2_1"
    // InternalOCLinEcore.g:26572:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleUnrestrictedName ) ;
    public final void rule__PackageCS__NsPrefixAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26576:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26577:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26577:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26578:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__NsPrefixAssignment_2_1"


    // $ANTLR start "rule__PackageCS__NsURIAssignment_3_1"
    // InternalOCLinEcore.g:26587:1: rule__PackageCS__NsURIAssignment_3_1 : ( ruleURI ) ;
    public final void rule__PackageCS__NsURIAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26591:1: ( ( ruleURI ) )
            // InternalOCLinEcore.g:26592:1: ( ruleURI )
            {
            // InternalOCLinEcore.g:26592:1: ( ruleURI )
            // InternalOCLinEcore.g:26593:1: ruleURI
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsURIURIParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleURI();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getNsURIURIParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__NsURIAssignment_3_1"


    // $ANTLR start "rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0"
    // InternalOCLinEcore.g:26602:1: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26606:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:26607:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:26607:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:26608:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0"


    // $ANTLR start "rule__PackageCS__OwnedPackagesAssignment_4_0_1_1"
    // InternalOCLinEcore.g:26617:1: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 : ( rulePackageCS ) ;
    public final void rule__PackageCS__OwnedPackagesAssignment_4_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26621:1: ( ( rulePackageCS ) )
            // InternalOCLinEcore.g:26622:1: ( rulePackageCS )
            {
            // InternalOCLinEcore.g:26622:1: ( rulePackageCS )
            // InternalOCLinEcore.g:26623:1: rulePackageCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePackageCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__OwnedPackagesAssignment_4_0_1_1"


    // $ANTLR start "rule__PackageCS__OwnedClassesAssignment_4_0_1_2"
    // InternalOCLinEcore.g:26632:1: rule__PackageCS__OwnedClassesAssignment_4_0_1_2 : ( ruleClassCS ) ;
    public final void rule__PackageCS__OwnedClassesAssignment_4_0_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26636:1: ( ( ruleClassCS ) )
            // InternalOCLinEcore.g:26637:1: ( ruleClassCS )
            {
            // InternalOCLinEcore.g:26637:1: ( ruleClassCS )
            // InternalOCLinEcore.g:26638:1: ruleClassCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_0_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleClassCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PackageCS__OwnedClassesAssignment_4_0_1_2"


    // $ANTLR start "rule__ParameterCS__NameAssignment_0"
    // InternalOCLinEcore.g:26647:1: rule__ParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__ParameterCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26651:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26652:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26652:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26653:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__NameAssignment_0"


    // $ANTLR start "rule__ParameterCS__OwnedTypeAssignment_1_1"
    // InternalOCLinEcore.g:26662:1: rule__ParameterCS__OwnedTypeAssignment_1_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__ParameterCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26666:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:26667:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:26667:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:26668:1: ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__OwnedTypeAssignment_1_1"


    // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_0"
    // InternalOCLinEcore.g:26677:1: rule__ParameterCS__QualifiersAssignment_2_1_0_0 : ( ( 'ordered' ) ) ;
    public final void rule__ParameterCS__QualifiersAssignment_2_1_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26681:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:26682:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:26682:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:26683:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
            }
            // InternalOCLinEcore.g:26684:1: ( 'ordered' )
            // InternalOCLinEcore.g:26685:1: 'ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
            }
            match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__QualifiersAssignment_2_1_0_0"


    // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_1"
    // InternalOCLinEcore.g:26700:1: rule__ParameterCS__QualifiersAssignment_2_1_0_1 : ( ( '!ordered' ) ) ;
    public final void rule__ParameterCS__QualifiersAssignment_2_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26704:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:26705:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:26705:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:26706:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }
            // InternalOCLinEcore.g:26707:1: ( '!ordered' )
            // InternalOCLinEcore.g:26708:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }
            match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__QualifiersAssignment_2_1_0_1"


    // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_2"
    // InternalOCLinEcore.g:26723:1: rule__ParameterCS__QualifiersAssignment_2_1_0_2 : ( ( 'unique' ) ) ;
    public final void rule__ParameterCS__QualifiersAssignment_2_1_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26727:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:26728:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:26728:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:26729:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
            }
            // InternalOCLinEcore.g:26730:1: ( 'unique' )
            // InternalOCLinEcore.g:26731:1: 'unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
            }
            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__QualifiersAssignment_2_1_0_2"


    // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_3"
    // InternalOCLinEcore.g:26746:1: rule__ParameterCS__QualifiersAssignment_2_1_0_3 : ( ( '!unique' ) ) ;
    public final void rule__ParameterCS__QualifiersAssignment_2_1_0_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26750:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:26751:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:26751:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:26752:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }
            // InternalOCLinEcore.g:26753:1: ( '!unique' )
            // InternalOCLinEcore.g:26754:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }
            match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__QualifiersAssignment_2_1_0_3"


    // $ANTLR start "rule__ParameterCS__OwnedAnnotationsAssignment_3_1"
    // InternalOCLinEcore.g:26769:1: rule__ParameterCS__OwnedAnnotationsAssignment_3_1 : ( ruleAnnotationElementCS ) ;
    public final void rule__ParameterCS__OwnedAnnotationsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26773:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:26774:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:26774:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:26775:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ParameterCS__OwnedAnnotationsAssignment_3_1"


    // $ANTLR start "rule__ImplicitOppositeCS__NameAssignment_1"
    // InternalOCLinEcore.g:26784:1: rule__ImplicitOppositeCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
    public final void rule__ImplicitOppositeCS__NameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26788:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26789:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26789:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26790:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__NameAssignment_1"


    // $ANTLR start "rule__ImplicitOppositeCS__OwnedTypeAssignment_3"
    // InternalOCLinEcore.g:26799:1: rule__ImplicitOppositeCS__OwnedTypeAssignment_3 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__ImplicitOppositeCS__OwnedTypeAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26803:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:26804:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:26804:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:26805:1: ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__OwnedTypeAssignment_3"


    // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0"
    // InternalOCLinEcore.g:26814:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 : ( ( 'ordered' ) ) ;
    public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26818:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:26819:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:26819:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:26820:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
            }
            // InternalOCLinEcore.g:26821:1: ( 'ordered' )
            // InternalOCLinEcore.g:26822:1: 'ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
            }
            match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0"


    // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1"
    // InternalOCLinEcore.g:26837:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 : ( ( '!ordered' ) ) ;
    public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26841:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:26842:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:26842:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:26843:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
            }
            // InternalOCLinEcore.g:26844:1: ( '!ordered' )
            // InternalOCLinEcore.g:26845:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
            }
            match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1"


    // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2"
    // InternalOCLinEcore.g:26860:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 : ( ( 'unique' ) ) ;
    public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26864:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:26865:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:26865:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:26866:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
            }
            // InternalOCLinEcore.g:26867:1: ( 'unique' )
            // InternalOCLinEcore.g:26868:1: 'unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
            }
            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2"


    // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3"
    // InternalOCLinEcore.g:26883:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 : ( ( '!unique' ) ) ;
    public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26887:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:26888:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:26888:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:26889:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
            }
            // InternalOCLinEcore.g:26890:1: ( '!unique' )
            // InternalOCLinEcore.g:26891:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
            }
            match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_0_0"
    // InternalOCLinEcore.g:26906:1: rule__ReferenceCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_0_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26910:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:26911:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:26911:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:26912:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:26913:1: ( 'static' )
            // InternalOCLinEcore.g:26914:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_0_0_0"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_0_1"
    // InternalOCLinEcore.g:26929:1: rule__ReferenceCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_0_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26933:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:26934:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:26934:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:26935:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:26936:1: ( 'definition' )
            // InternalOCLinEcore.g:26937:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_0_0_1"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_1_0"
    // InternalOCLinEcore.g:26952:1: rule__ReferenceCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26956:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:26957:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:26957:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:26958:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:26959:1: ( 'definition' )
            // InternalOCLinEcore.g:26960:1: 'definition'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_0_1_0"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_1_1"
    // InternalOCLinEcore.g:26975:1: rule__ReferenceCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26979:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:26980:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:26980:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:26981:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:26982:1: ( 'static' )
            // InternalOCLinEcore.g:26983:1: 'static'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_0_1_1"


    // $ANTLR start "rule__ReferenceCS__NameAssignment_2"
    // InternalOCLinEcore.g:26998:1: rule__ReferenceCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__ReferenceCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27002:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27003:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:27003:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27004:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__NameAssignment_2"


    // $ANTLR start "rule__ReferenceCS__ReferredOppositeAssignment_3_1"
    // InternalOCLinEcore.g:27013:1: rule__ReferenceCS__ReferredOppositeAssignment_3_1 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ReferenceCS__ReferredOppositeAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27017:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:27018:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:27018:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27019:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());
            }
            // InternalOCLinEcore.g:27020:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27021:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyUnrestrictedNameParserRuleCall_3_1_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyUnrestrictedNameParserRuleCall_3_1_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__ReferredOppositeAssignment_3_1"


    // $ANTLR start "rule__ReferenceCS__OwnedTypeAssignment_4_1"
    // InternalOCLinEcore.g:27032:1: rule__ReferenceCS__OwnedTypeAssignment_4_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__ReferenceCS__OwnedTypeAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27036:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:27037:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:27037:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:27038:1: ruleTypedMultiplicityRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__OwnedTypeAssignment_4_1"


    // $ANTLR start "rule__ReferenceCS__DefaultAssignment_5_1"
    // InternalOCLinEcore.g:27047:1: rule__ReferenceCS__DefaultAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__ReferenceCS__DefaultAssignment_5_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27051:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:27052:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:27052:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:27053:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__DefaultAssignment_5_1"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_0"
    // InternalOCLinEcore.g:27062:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_0 : ( ( 'composes' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27066:1: ( ( ( 'composes' ) ) )
            // InternalOCLinEcore.g:27067:1: ( ( 'composes' ) )
            {
            // InternalOCLinEcore.g:27067:1: ( ( 'composes' ) )
            // InternalOCLinEcore.g:27068:1: ( 'composes' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
            }
            // InternalOCLinEcore.g:27069:1: ( 'composes' )
            // InternalOCLinEcore.g:27070:1: 'composes'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
            }
            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_0"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_1"
    // InternalOCLinEcore.g:27085:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_1 : ( ( '!composes' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27089:1: ( ( ( '!composes' ) ) )
            // InternalOCLinEcore.g:27090:1: ( ( '!composes' ) )
            {
            // InternalOCLinEcore.g:27090:1: ( ( '!composes' ) )
            // InternalOCLinEcore.g:27091:1: ( '!composes' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }
            // InternalOCLinEcore.g:27092:1: ( '!composes' )
            // InternalOCLinEcore.g:27093:1: '!composes'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }
            match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_1"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_2"
    // InternalOCLinEcore.g:27108:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_2 : ( ( 'derived' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27112:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:27113:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:27113:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:27114:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
            }
            // InternalOCLinEcore.g:27115:1: ( 'derived' )
            // InternalOCLinEcore.g:27116:1: 'derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
            }
            match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_2"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_3"
    // InternalOCLinEcore.g:27131:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_3 : ( ( '!derived' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27135:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:27136:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:27136:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:27137:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }
            // InternalOCLinEcore.g:27138:1: ( '!derived' )
            // InternalOCLinEcore.g:27139:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }
            match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_3"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_4"
    // InternalOCLinEcore.g:27154:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_4 : ( ( 'ordered' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27158:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:27159:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:27159:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:27160:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
            }
            // InternalOCLinEcore.g:27161:1: ( 'ordered' )
            // InternalOCLinEcore.g:27162:1: 'ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
            }
            match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_4"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_5"
    // InternalOCLinEcore.g:27177:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_5 : ( ( '!ordered' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_5() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27181:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:27182:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:27182:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:27183:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }
            // InternalOCLinEcore.g:27184:1: ( '!ordered' )
            // InternalOCLinEcore.g:27185:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }
            match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_5"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_6"
    // InternalOCLinEcore.g:27200:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_6 : ( ( 'readonly' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27204:1: ( ( ( 'readonly' ) ) )
            // InternalOCLinEcore.g:27205:1: ( ( 'readonly' ) )
            {
            // InternalOCLinEcore.g:27205:1: ( ( 'readonly' ) )
            // InternalOCLinEcore.g:27206:1: ( 'readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
            }
            // InternalOCLinEcore.g:27207:1: ( 'readonly' )
            // InternalOCLinEcore.g:27208:1: 'readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
            }
            match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_6"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_7"
    // InternalOCLinEcore.g:27223:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_7 : ( ( '!readonly' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_7() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27227:1: ( ( ( '!readonly' ) ) )
            // InternalOCLinEcore.g:27228:1: ( ( '!readonly' ) )
            {
            // InternalOCLinEcore.g:27228:1: ( ( '!readonly' ) )
            // InternalOCLinEcore.g:27229:1: ( '!readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }
            // InternalOCLinEcore.g:27230:1: ( '!readonly' )
            // InternalOCLinEcore.g:27231:1: '!readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }
            match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_7"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_8"
    // InternalOCLinEcore.g:27246:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_8 : ( ( 'resolve' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_8() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27250:1: ( ( ( 'resolve' ) ) )
            // InternalOCLinEcore.g:27251:1: ( ( 'resolve' ) )
            {
            // InternalOCLinEcore.g:27251:1: ( ( 'resolve' ) )
            // InternalOCLinEcore.g:27252:1: ( 'resolve' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
            }
            // InternalOCLinEcore.g:27253:1: ( 'resolve' )
            // InternalOCLinEcore.g:27254:1: 'resolve'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
            }
            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_8"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_9"
    // InternalOCLinEcore.g:27269:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_9 : ( ( '!resolve' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_9() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27273:1: ( ( ( '!resolve' ) ) )
            // InternalOCLinEcore.g:27274:1: ( ( '!resolve' ) )
            {
            // InternalOCLinEcore.g:27274:1: ( ( '!resolve' ) )
            // InternalOCLinEcore.g:27275:1: ( '!resolve' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }
            // InternalOCLinEcore.g:27276:1: ( '!resolve' )
            // InternalOCLinEcore.g:27277:1: '!resolve'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }
            match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_9"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_10"
    // InternalOCLinEcore.g:27292:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_10 : ( ( 'transient' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_10() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27296:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:27297:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:27297:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:27298:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
            }
            // InternalOCLinEcore.g:27299:1: ( 'transient' )
            // InternalOCLinEcore.g:27300:1: 'transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
            }
            match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_10"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_11"
    // InternalOCLinEcore.g:27315:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_11 : ( ( '!transient' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_11() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27319:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:27320:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:27320:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:27321:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }
            // InternalOCLinEcore.g:27322:1: ( '!transient' )
            // InternalOCLinEcore.g:27323:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }
            match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_11"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_12"
    // InternalOCLinEcore.g:27338:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_12 : ( ( 'unique' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_12() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27342:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:27343:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:27343:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:27344:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
            }
            // InternalOCLinEcore.g:27345:1: ( 'unique' )
            // InternalOCLinEcore.g:27346:1: 'unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
            }
            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_12"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_13"
    // InternalOCLinEcore.g:27361:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_13 : ( ( '!unique' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_13() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27365:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:27366:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:27366:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:27367:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }
            // InternalOCLinEcore.g:27368:1: ( '!unique' )
            // InternalOCLinEcore.g:27369:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }
            match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_13"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_14"
    // InternalOCLinEcore.g:27384:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_14 : ( ( 'unsettable' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_14() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27388:1: ( ( ( 'unsettable' ) ) )
            // InternalOCLinEcore.g:27389:1: ( ( 'unsettable' ) )
            {
            // InternalOCLinEcore.g:27389:1: ( ( 'unsettable' ) )
            // InternalOCLinEcore.g:27390:1: ( 'unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
            }
            // InternalOCLinEcore.g:27391:1: ( 'unsettable' )
            // InternalOCLinEcore.g:27392:1: 'unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
            }
            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_14"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_15"
    // InternalOCLinEcore.g:27407:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_15 : ( ( '!unsettable' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_15() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27411:1: ( ( ( '!unsettable' ) ) )
            // InternalOCLinEcore.g:27412:1: ( ( '!unsettable' ) )
            {
            // InternalOCLinEcore.g:27412:1: ( ( '!unsettable' ) )
            // InternalOCLinEcore.g:27413:1: ( '!unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }
            // InternalOCLinEcore.g:27414:1: ( '!unsettable' )
            // InternalOCLinEcore.g:27415:1: '!unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }
            match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_15"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_16"
    // InternalOCLinEcore.g:27430:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_16 : ( ( 'volatile' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_16() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27434:1: ( ( ( 'volatile' ) ) )
            // InternalOCLinEcore.g:27435:1: ( ( 'volatile' ) )
            {
            // InternalOCLinEcore.g:27435:1: ( ( 'volatile' ) )
            // InternalOCLinEcore.g:27436:1: ( 'volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
            }
            // InternalOCLinEcore.g:27437:1: ( 'volatile' )
            // InternalOCLinEcore.g:27438:1: 'volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
            }
            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_16"


    // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_17"
    // InternalOCLinEcore.g:27453:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_17 : ( ( '!volatile' ) ) ;
    public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_17() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27457:1: ( ( ( '!volatile' ) ) )
            // InternalOCLinEcore.g:27458:1: ( ( '!volatile' ) )
            {
            // InternalOCLinEcore.g:27458:1: ( ( '!volatile' ) )
            // InternalOCLinEcore.g:27459:1: ( '!volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }
            // InternalOCLinEcore.g:27460:1: ( '!volatile' )
            // InternalOCLinEcore.g:27461:1: '!volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }
            match(input,135,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__QualifiersAssignment_6_1_0_17"


    // $ANTLR start "rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0"
    // InternalOCLinEcore.g:27476:1: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27480:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:27481:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:27481:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:27482:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0"


    // $ANTLR start "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1"
    // InternalOCLinEcore.g:27491:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27495:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:27496:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:27496:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27497:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_1_0());
            }
            // InternalOCLinEcore.g:27498:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27499:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_1_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_1_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1"


    // $ANTLR start "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1"
    // InternalOCLinEcore.g:27510:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27514:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:27515:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:27515:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27516:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_2_1_0());
            }
            // InternalOCLinEcore.g:27517:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27518:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_2_1_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_2_1_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1"


    // $ANTLR start "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3"
    // InternalOCLinEcore.g:27529:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 : ( ruleSpecificationCS ) ;
    public final void rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27533:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:27534:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:27534:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:27535:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_2_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_2_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3"


    // $ANTLR start "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3"
    // InternalOCLinEcore.g:27544:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 : ( ruleSpecificationCS ) ;
    public final void rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27548:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:27549:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:27549:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:27550:1: ruleSpecificationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_3_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_3_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3"


    // $ANTLR start "rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0"
    // InternalOCLinEcore.g:27559:1: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 : ( ruleImplicitOppositeCS ) ;
    public final void rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27563:1: ( ( ruleImplicitOppositeCS ) )
            // InternalOCLinEcore.g:27564:1: ( ruleImplicitOppositeCS )
            {
            // InternalOCLinEcore.g:27564:1: ( ruleImplicitOppositeCS )
            // InternalOCLinEcore.g:27565:1: ruleImplicitOppositeCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesImplicitOppositeCSParserRuleCall_7_0_1_4_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleImplicitOppositeCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesImplicitOppositeCSParserRuleCall_7_0_1_4_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0"


    // $ANTLR start "rule__SpecificationCS__OwnedExpressionAssignment_0"
    // InternalOCLinEcore.g:27574:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
    public final void rule__SpecificationCS__OwnedExpressionAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27578:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27579:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27579:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27580:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SpecificationCS__OwnedExpressionAssignment_0"


    // $ANTLR start "rule__SpecificationCS__ExprStringAssignment_1"
    // InternalOCLinEcore.g:27589:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
    public final void rule__SpecificationCS__ExprStringAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27593:1: ( ( RULE_UNQUOTED_STRING ) )
            // InternalOCLinEcore.g:27594:1: ( RULE_UNQUOTED_STRING )
            {
            // InternalOCLinEcore.g:27594:1: ( RULE_UNQUOTED_STRING )
            // InternalOCLinEcore.g:27595:1: RULE_UNQUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());
            }
            match(input,RULE_UNQUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SpecificationCS__ExprStringAssignment_1"


    // $ANTLR start "rule__StructuredClassCS__IsAbstractAssignment_0"
    // InternalOCLinEcore.g:27604:1: rule__StructuredClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
    public final void rule__StructuredClassCS__IsAbstractAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27608:1: ( ( ( 'abstract' ) ) )
            // InternalOCLinEcore.g:27609:1: ( ( 'abstract' ) )
            {
            // InternalOCLinEcore.g:27609:1: ( ( 'abstract' ) )
            // InternalOCLinEcore.g:27610:1: ( 'abstract' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
            }
            // InternalOCLinEcore.g:27611:1: ( 'abstract' )
            // InternalOCLinEcore.g:27612:1: 'abstract'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
            }
            match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__IsAbstractAssignment_0"


    // $ANTLR start "rule__StructuredClassCS__NameAssignment_2"
    // InternalOCLinEcore.g:27627:1: rule__StructuredClassCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__StructuredClassCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27631:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27632:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:27632:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27633:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__NameAssignment_2"


    // $ANTLR start "rule__StructuredClassCS__OwnedSignatureAssignment_3"
    // InternalOCLinEcore.g:27642:1: rule__StructuredClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
    public final void rule__StructuredClassCS__OwnedSignatureAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27646:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:27647:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:27647:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:27648:1: ruleTemplateSignatureCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedSignatureAssignment_3"


    // $ANTLR start "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1"
    // InternalOCLinEcore.g:27657:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 : ( ruleTypedRefCS ) ;
    public final void rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27661:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:27662:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:27662:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:27663:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1"


    // $ANTLR start "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1"
    // InternalOCLinEcore.g:27672:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 : ( ruleTypedRefCS ) ;
    public final void rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27676:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:27677:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:27677:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:27678:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1"


    // $ANTLR start "rule__StructuredClassCS__InstanceClassNameAssignment_5_1"
    // InternalOCLinEcore.g:27687:1: rule__StructuredClassCS__InstanceClassNameAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__StructuredClassCS__InstanceClassNameAssignment_5_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27691:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:27692:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:27692:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:27693:1: RULE_SINGLE_QUOTED_STRING
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
            }
            match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__InstanceClassNameAssignment_5_1"


    // $ANTLR start "rule__StructuredClassCS__IsInterfaceAssignment_6_1"
    // InternalOCLinEcore.g:27702:1: rule__StructuredClassCS__IsInterfaceAssignment_6_1 : ( ( 'interface' ) ) ;
    public final void rule__StructuredClassCS__IsInterfaceAssignment_6_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27706:1: ( ( ( 'interface' ) ) )
            // InternalOCLinEcore.g:27707:1: ( ( 'interface' ) )
            {
            // InternalOCLinEcore.g:27707:1: ( ( 'interface' ) )
            // InternalOCLinEcore.g:27708:1: ( 'interface' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
            }
            // InternalOCLinEcore.g:27709:1: ( 'interface' )
            // InternalOCLinEcore.g:27710:1: 'interface'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
            }
            match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__IsInterfaceAssignment_6_1"


    // $ANTLR start "rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0"
    // InternalOCLinEcore.g:27725:1: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
    public final void rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27729:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:27730:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:27730:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:27731:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0"


    // $ANTLR start "rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1"
    // InternalOCLinEcore.g:27740:1: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 : ( ruleOperationCS ) ;
    public final void rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27744:1: ( ( ruleOperationCS ) )
            // InternalOCLinEcore.g:27745:1: ( ruleOperationCS )
            {
            // InternalOCLinEcore.g:27745:1: ( ruleOperationCS )
            // InternalOCLinEcore.g:27746:1: ruleOperationCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleOperationCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1"


    // $ANTLR start "rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2"
    // InternalOCLinEcore.g:27755:1: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 : ( ruleStructuralFeatureCS ) ;
    public final void rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27759:1: ( ( ruleStructuralFeatureCS ) )
            // InternalOCLinEcore.g:27760:1: ( ruleStructuralFeatureCS )
            {
            // InternalOCLinEcore.g:27760:1: ( ruleStructuralFeatureCS )
            // InternalOCLinEcore.g:27761:1: ruleStructuralFeatureCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleStructuralFeatureCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2"


    // $ANTLR start "rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3"
    // InternalOCLinEcore.g:27770:1: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 : ( ruleInvariantConstraintCS ) ;
    public final void rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27774:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:27775:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:27775:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:27776:1: ruleInvariantConstraintCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_7_0_1_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleInvariantConstraintCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_7_0_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3"


    // $ANTLR start "rule__SysMLCS__OwnedDetailsAssignment_2_0_0"
    // InternalOCLinEcore.g:27785:1: rule__SysMLCS__OwnedDetailsAssignment_2_0_0 : ( ruleDetailCS ) ;
    public final void rule__SysMLCS__OwnedDetailsAssignment_2_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27789:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:27790:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:27790:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:27791:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_0_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__OwnedDetailsAssignment_2_0_0"


    // $ANTLR start "rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0"
    // InternalOCLinEcore.g:27800:1: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 : ( ruleDetailCS ) ;
    public final void rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27804:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:27805:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:27805:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:27806:1: ruleDetailCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_1_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleDetailCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_1_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0"


    // $ANTLR start "rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1"
    // InternalOCLinEcore.g:27815:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27819:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:27820:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:27820:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:27821:1: ruleMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1"


    // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_1"
    // InternalOCLinEcore.g:27830:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27834:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:27835:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:27835:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:27836:1: ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__OwnedParametersAssignment_0_1"


    // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1"
    // InternalOCLinEcore.g:27845:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27849:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:27850:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:27850:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:27851:1: ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1"


    // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_1"
    // InternalOCLinEcore.g:27860:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27864:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:27865:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:27865:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:27866:1: ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__OwnedParametersAssignment_1_1"


    // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1"
    // InternalOCLinEcore.g:27875:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27879:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:27880:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:27880:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:27881:1: ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1"


    // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"
    // InternalOCLinEcore.g:27890:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27894:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:27895:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:27895:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:27896:1: rulePathNameCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePathNameCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"


    // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1"
    // InternalOCLinEcore.g:27905:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 : ( ruleTemplateBindingCS ) ;
    public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27909:1: ( ( ruleTemplateBindingCS ) )
            // InternalOCLinEcore.g:27910:1: ( ruleTemplateBindingCS )
            {
            // InternalOCLinEcore.g:27910:1: ( ruleTemplateBindingCS )
            // InternalOCLinEcore.g:27911:1: ruleTemplateBindingCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateBindingCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1"


    // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1"
    // InternalOCLinEcore.g:27920:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 : ( ruleTemplateBindingCS ) ;
    public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27924:1: ( ( ruleTemplateBindingCS ) )
            // InternalOCLinEcore.g:27925:1: ( ruleTemplateBindingCS )
            {
            // InternalOCLinEcore.g:27925:1: ( ruleTemplateBindingCS )
            // InternalOCLinEcore.g:27926:1: ruleTemplateBindingCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateBindingCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1"


    // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_0"
    // InternalOCLinEcore.g:27936:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
    public final void rule__URIPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27940:1: ( ( ruleURIFirstPathElementCS ) )
            // InternalOCLinEcore.g:27941:1: ( ruleURIFirstPathElementCS )
            {
            // InternalOCLinEcore.g:27941:1: ( ruleURIFirstPathElementCS )
            // InternalOCLinEcore.g:27942:1: ruleURIFirstPathElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleURIFirstPathElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__OwnedPathElementsAssignment_0"


    // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_1_1"
    // InternalOCLinEcore.g:27951:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
    public final void rule__URIPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27955:1: ( ( ruleNextPathElementCS ) )
            // InternalOCLinEcore.g:27956:1: ( ruleNextPathElementCS )
            {
            // InternalOCLinEcore.g:27956:1: ( ruleNextPathElementCS )
            // InternalOCLinEcore.g:27957:1: ruleNextPathElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNextPathElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIPathNameCS__OwnedPathElementsAssignment_1_1"


    // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_0"
    // InternalOCLinEcore.g:27966:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27970:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:27971:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:27971:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27972:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
            }
            // InternalOCLinEcore.g:27973:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27974:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__ReferredElementAssignment_0"


    // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"
    // InternalOCLinEcore.g:27985:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
    public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27989:1: ( ( ( ruleURI ) ) )
            // InternalOCLinEcore.g:27990:1: ( ( ruleURI ) )
            {
            // InternalOCLinEcore.g:27990:1: ( ( ruleURI ) )
            // InternalOCLinEcore.g:27991:1: ( ruleURI )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
            }
            // InternalOCLinEcore.g:27992:1: ( ruleURI )
            // InternalOCLinEcore.g:27993:1: ruleURI
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleURI();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"


    // $ANTLR start "rule__PrimitiveTypeCS__NameAssignment"
    // InternalOCLinEcore.g:28005:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
    public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28009:1: ( ( rulePrimitiveTypeIdentifier ) )
            // InternalOCLinEcore.g:28010:1: ( rulePrimitiveTypeIdentifier )
            {
            // InternalOCLinEcore.g:28010:1: ( rulePrimitiveTypeIdentifier )
            // InternalOCLinEcore.g:28011:1: rulePrimitiveTypeIdentifier
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePrimitiveTypeIdentifier();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrimitiveTypeCS__NameAssignment"


    // $ANTLR start "rule__CollectionTypeCS__NameAssignment_0"
    // InternalOCLinEcore.g:28020:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
    public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28024:1: ( ( ruleCollectionTypeIdentifier ) )
            // InternalOCLinEcore.g:28025:1: ( ruleCollectionTypeIdentifier )
            {
            // InternalOCLinEcore.g:28025:1: ( ruleCollectionTypeIdentifier )
            // InternalOCLinEcore.g:28026:1: ruleCollectionTypeIdentifier
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCollectionTypeIdentifier();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__NameAssignment_0"


    // $ANTLR start "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"
    // InternalOCLinEcore.g:28035:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
    public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28039:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
            // InternalOCLinEcore.g:28040:1: ( ruleTypeExpWithoutMultiplicityCS )
            {
            // InternalOCLinEcore.g:28040:1: ( ruleTypeExpWithoutMultiplicityCS )
            // InternalOCLinEcore.g:28041:1: ruleTypeExpWithoutMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpWithoutMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"


    // $ANTLR start "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"
    // InternalOCLinEcore.g:28050:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
    public final void rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28054:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:28055:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:28055:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:28056:1: ruleMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"


    // $ANTLR start "rule__MapTypeCS__NameAssignment_0"
    // InternalOCLinEcore.g:28065:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
    public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28069:1: ( ( ( 'Map' ) ) )
            // InternalOCLinEcore.g:28070:1: ( ( 'Map' ) )
            {
            // InternalOCLinEcore.g:28070:1: ( ( 'Map' ) )
            // InternalOCLinEcore.g:28071:1: ( 'Map' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }
            // InternalOCLinEcore.g:28072:1: ( 'Map' )
            // InternalOCLinEcore.g:28073:1: 'Map'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }
            match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__NameAssignment_0"


    // $ANTLR start "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"
    // InternalOCLinEcore.g:28088:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28092:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:28093:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:28093:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:28094:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"


    // $ANTLR start "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"
    // InternalOCLinEcore.g:28103:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
    public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28107:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:28108:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:28108:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:28109:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"


    // $ANTLR start "rule__TupleTypeCS__NameAssignment_0"
    // InternalOCLinEcore.g:28118:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
    public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28122:1: ( ( ( 'Tuple' ) ) )
            // InternalOCLinEcore.g:28123:1: ( ( 'Tuple' ) )
            {
            // InternalOCLinEcore.g:28123:1: ( ( 'Tuple' ) )
            // InternalOCLinEcore.g:28124:1: ( 'Tuple' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }
            // InternalOCLinEcore.g:28125:1: ( 'Tuple' )
            // InternalOCLinEcore.g:28126:1: 'Tuple'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }
            match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__NameAssignment_0"


    // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"
    // InternalOCLinEcore.g:28141:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
    public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28145:1: ( ( ruleTuplePartCS ) )
            // InternalOCLinEcore.g:28146:1: ( ruleTuplePartCS )
            {
            // InternalOCLinEcore.g:28146:1: ( ruleTuplePartCS )
            // InternalOCLinEcore.g:28147:1: ruleTuplePartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTuplePartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"


    // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"
    // InternalOCLinEcore.g:28156:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
    public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28160:1: ( ( ruleTuplePartCS ) )
            // InternalOCLinEcore.g:28161:1: ( ruleTuplePartCS )
            {
            // InternalOCLinEcore.g:28161:1: ( ruleTuplePartCS )
            // InternalOCLinEcore.g:28162:1: ruleTuplePartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTuplePartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"


    // $ANTLR start "rule__TuplePartCS__NameAssignment_0"
    // InternalOCLinEcore.g:28171:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28175:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:28176:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:28176:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:28177:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__NameAssignment_0"


    // $ANTLR start "rule__TuplePartCS__OwnedTypeAssignment_2"
    // InternalOCLinEcore.g:28186:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
    public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28190:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:28191:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:28191:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:28192:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TuplePartCS__OwnedTypeAssignment_2"


    // $ANTLR start "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"
    // InternalOCLinEcore.g:28201:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
    public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28205:1: ( ( ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:28206:1: ( ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:28206:1: ( ruleCollectionTypeCS )
            // InternalOCLinEcore.g:28207:1: ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"


    // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"
    // InternalOCLinEcore.g:28216:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
    public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28220:1: ( ( ruleCollectionLiteralPartCS ) )
            // InternalOCLinEcore.g:28221:1: ( ruleCollectionLiteralPartCS )
            {
            // InternalOCLinEcore.g:28221:1: ( ruleCollectionLiteralPartCS )
            // InternalOCLinEcore.g:28222:1: ruleCollectionLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCollectionLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"


    // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"
    // InternalOCLinEcore.g:28231:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
    public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28235:1: ( ( ruleCollectionLiteralPartCS ) )
            // InternalOCLinEcore.g:28236:1: ( ruleCollectionLiteralPartCS )
            {
            // InternalOCLinEcore.g:28236:1: ( ruleCollectionLiteralPartCS )
            // InternalOCLinEcore.g:28237:1: ruleCollectionLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCollectionLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"


    // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"
    // InternalOCLinEcore.g:28246:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
    public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28250:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28251:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28251:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28252:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"


    // $ANTLR start "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"
    // InternalOCLinEcore.g:28261:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
    public final void rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28265:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28266:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28266:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28267:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"


    // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"
    // InternalOCLinEcore.g:28276:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
    public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28280:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:28281:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:28281:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:28282:1: rulePatternExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePatternExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"


    // $ANTLR start "rule__CollectionPatternCS__OwnedTypeAssignment_0"
    // InternalOCLinEcore.g:28291:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
    public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28295:1: ( ( ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:28296:1: ( ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:28296:1: ( ruleCollectionTypeCS )
            // InternalOCLinEcore.g:28297:1: ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__OwnedTypeAssignment_0"


    // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"
    // InternalOCLinEcore.g:28306:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
    public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28310:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:28311:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:28311:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:28312:1: rulePatternExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePatternExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"


    // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"
    // InternalOCLinEcore.g:28321:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
    public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28325:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:28326:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:28326:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:28327:1: rulePatternExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePatternExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"


    // $ANTLR start "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"
    // InternalOCLinEcore.g:28336:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
    public final void rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28340:1: ( ( ruleIdentifier ) )
            // InternalOCLinEcore.g:28341:1: ( ruleIdentifier )
            {
            // InternalOCLinEcore.g:28341:1: ( ruleIdentifier )
            // InternalOCLinEcore.g:28342:1: ruleIdentifier
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleIdentifier();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"


    // $ANTLR start "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"
    // InternalOCLinEcore.g:28351:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ShadowPartCS__ReferredPropertyAssignment_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28355:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:28356:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:28356:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:28357:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
            }
            // InternalOCLinEcore.g:28358:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:28359:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"


    // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"
    // InternalOCLinEcore.g:28370:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
    public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28374:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
            // InternalOCLinEcore.g:28375:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
            {
            // InternalOCLinEcore.g:28375:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
            // InternalOCLinEcore.g:28376:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
            }
            // InternalOCLinEcore.g:28377:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
            // InternalOCLinEcore.g:28377:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"


    // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"
    // InternalOCLinEcore.g:28386:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
    public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28390:1: ( ( ruleStringLiteralExpCS ) )
            // InternalOCLinEcore.g:28391:1: ( ruleStringLiteralExpCS )
            {
            // InternalOCLinEcore.g:28391:1: ( ruleStringLiteralExpCS )
            // InternalOCLinEcore.g:28392:1: ruleStringLiteralExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleStringLiteralExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"


    // $ANTLR start "rule__PatternExpCS__PatternVariableNameAssignment_0"
    // InternalOCLinEcore.g:28401:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__PatternExpCS__PatternVariableNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28405:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:28406:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:28406:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:28407:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__PatternVariableNameAssignment_0"


    // $ANTLR start "rule__PatternExpCS__OwnedPatternTypeAssignment_2"
    // InternalOCLinEcore.g:28416:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
    public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28420:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:28421:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:28421:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:28422:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PatternExpCS__OwnedPatternTypeAssignment_2"


    // $ANTLR start "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"
    // InternalOCLinEcore.g:28431:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
    public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28435:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28436:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28436:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28437:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"


    // $ANTLR start "rule__MapLiteralExpCS__OwnedTypeAssignment_0"
    // InternalOCLinEcore.g:28446:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
    public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28450:1: ( ( ruleMapTypeCS ) )
            // InternalOCLinEcore.g:28451:1: ( ruleMapTypeCS )
            {
            // InternalOCLinEcore.g:28451:1: ( ruleMapTypeCS )
            // InternalOCLinEcore.g:28452:1: ruleMapTypeCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMapTypeCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__OwnedTypeAssignment_0"


    // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"
    // InternalOCLinEcore.g:28461:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
    public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28465:1: ( ( ruleMapLiteralPartCS ) )
            // InternalOCLinEcore.g:28466:1: ( ruleMapLiteralPartCS )
            {
            // InternalOCLinEcore.g:28466:1: ( ruleMapLiteralPartCS )
            // InternalOCLinEcore.g:28467:1: ruleMapLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMapLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"


    // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"
    // InternalOCLinEcore.g:28476:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
    public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28480:1: ( ( ruleMapLiteralPartCS ) )
            // InternalOCLinEcore.g:28481:1: ( ruleMapLiteralPartCS )
            {
            // InternalOCLinEcore.g:28481:1: ( ruleMapLiteralPartCS )
            // InternalOCLinEcore.g:28482:1: ruleMapLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMapLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"


    // $ANTLR start "rule__MapLiteralPartCS__OwnedKeyAssignment_0"
    // InternalOCLinEcore.g:28491:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
    public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28495:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28496:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28496:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28497:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__OwnedKeyAssignment_0"


    // $ANTLR start "rule__MapLiteralPartCS__OwnedValueAssignment_2"
    // InternalOCLinEcore.g:28506:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
    public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28510:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28511:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28511:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28512:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MapLiteralPartCS__OwnedValueAssignment_2"


    // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"
    // InternalOCLinEcore.g:28521:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
    public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28525:1: ( ( ruleTupleLiteralPartCS ) )
            // InternalOCLinEcore.g:28526:1: ( ruleTupleLiteralPartCS )
            {
            // InternalOCLinEcore.g:28526:1: ( ruleTupleLiteralPartCS )
            // InternalOCLinEcore.g:28527:1: ruleTupleLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTupleLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"


    // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"
    // InternalOCLinEcore.g:28536:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
    public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28540:1: ( ( ruleTupleLiteralPartCS ) )
            // InternalOCLinEcore.g:28541:1: ( ruleTupleLiteralPartCS )
            {
            // InternalOCLinEcore.g:28541:1: ( ruleTupleLiteralPartCS )
            // InternalOCLinEcore.g:28542:1: ruleTupleLiteralPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTupleLiteralPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"


    // $ANTLR start "rule__TupleLiteralPartCS__NameAssignment_0"
    // InternalOCLinEcore.g:28551:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28555:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:28556:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:28556:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:28557:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__NameAssignment_0"


    // $ANTLR start "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"
    // InternalOCLinEcore.g:28566:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28570:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:28571:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:28571:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:28572:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"


    // $ANTLR start "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"
    // InternalOCLinEcore.g:28581:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28585:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28586:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28586:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28587:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"


    // $ANTLR start "rule__NumberLiteralExpCS__SymbolAssignment"
    // InternalOCLinEcore.g:28596:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
    public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28600:1: ( ( ruleNUMBER_LITERAL ) )
            // InternalOCLinEcore.g:28601:1: ( ruleNUMBER_LITERAL )
            {
            // InternalOCLinEcore.g:28601:1: ( ruleNUMBER_LITERAL )
            // InternalOCLinEcore.g:28602:1: ruleNUMBER_LITERAL
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNUMBER_LITERAL();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NumberLiteralExpCS__SymbolAssignment"


    // $ANTLR start "rule__StringLiteralExpCS__SegmentsAssignment"
    // InternalOCLinEcore.g:28611:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
    public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28615:1: ( ( ruleStringLiteral ) )
            // InternalOCLinEcore.g:28616:1: ( ruleStringLiteral )
            {
            // InternalOCLinEcore.g:28616:1: ( ruleStringLiteral )
            // InternalOCLinEcore.g:28617:1: ruleStringLiteral
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleStringLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__StringLiteralExpCS__SegmentsAssignment"


    // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_0"
    // InternalOCLinEcore.g:28626:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
    public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28630:1: ( ( ( 'true' ) ) )
            // InternalOCLinEcore.g:28631:1: ( ( 'true' ) )
            {
            // InternalOCLinEcore.g:28631:1: ( ( 'true' ) )
            // InternalOCLinEcore.g:28632:1: ( 'true' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }
            // InternalOCLinEcore.g:28633:1: ( 'true' )
            // InternalOCLinEcore.g:28634:1: 'true'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }
            match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__BooleanLiteralExpCS__SymbolAssignment_0"


    // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_1"
    // InternalOCLinEcore.g:28649:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
    public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28653:1: ( ( ( 'false' ) ) )
            // InternalOCLinEcore.g:28654:1: ( ( 'false' ) )
            {
            // InternalOCLinEcore.g:28654:1: ( ( 'false' ) )
            // InternalOCLinEcore.g:28655:1: ( 'false' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }
            // InternalOCLinEcore.g:28656:1: ( 'false' )
            // InternalOCLinEcore.g:28657:1: 'false'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }
            match(input,140,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__BooleanLiteralExpCS__SymbolAssignment_1"


    // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"
    // InternalOCLinEcore.g:28672:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28676:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:28677:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:28677:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:28678:1: ruleMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"


    // $ANTLR start "rule__TypeLiteralExpCS__OwnedTypeAssignment"
    // InternalOCLinEcore.g:28687:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
    public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28691:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
            // InternalOCLinEcore.g:28692:1: ( ruleTypeLiteralWithMultiplicityCS )
            {
            // InternalOCLinEcore.g:28692:1: ( ruleTypeLiteralWithMultiplicityCS )
            // InternalOCLinEcore.g:28693:1: ruleTypeLiteralWithMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeLiteralWithMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeLiteralExpCS__OwnedTypeAssignment"


    // $ANTLR start "rule__TypeNameExpCS__OwnedPathNameAssignment_0"
    // InternalOCLinEcore.g:28702:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28706:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:28707:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:28707:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:28708:1: rulePathNameCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePathNameCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__OwnedPathNameAssignment_0"


    // $ANTLR start "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"
    // InternalOCLinEcore.g:28717:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
    public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28721:1: ( ( ruleCurlyBracketedClauseCS ) )
            // InternalOCLinEcore.g:28722:1: ( ruleCurlyBracketedClauseCS )
            {
            // InternalOCLinEcore.g:28722:1: ( ruleCurlyBracketedClauseCS )
            // InternalOCLinEcore.g:28723:1: ruleCurlyBracketedClauseCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCurlyBracketedClauseCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"


    // $ANTLR start "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"
    // InternalOCLinEcore.g:28732:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
    public final void rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28736:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28737:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28737:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28738:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"


    // $ANTLR start "rule__TypeExpCS__OwnedMultiplicityAssignment_1"
    // InternalOCLinEcore.g:28747:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28751:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:28752:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:28752:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:28753:1: ruleMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeExpCS__OwnedMultiplicityAssignment_1"


    // $ANTLR start "rule__ExpCS__NameAssignment_0_1_1"
    // InternalOCLinEcore.g:28762:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
    public final void rule__ExpCS__NameAssignment_0_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28766:1: ( ( ruleBinaryOperatorName ) )
            // InternalOCLinEcore.g:28767:1: ( ruleBinaryOperatorName )
            {
            // InternalOCLinEcore.g:28767:1: ( ruleBinaryOperatorName )
            // InternalOCLinEcore.g:28768:1: ruleBinaryOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleBinaryOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__NameAssignment_0_1_1"


    // $ANTLR start "rule__ExpCS__OwnedRightAssignment_0_1_2"
    // InternalOCLinEcore.g:28777:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
    public final void rule__ExpCS__OwnedRightAssignment_0_1_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28781:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:28782:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:28782:1: ( ruleExpCS )
            // InternalOCLinEcore.g:28783:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ExpCS__OwnedRightAssignment_0_1_2"


    // $ANTLR start "rule__PrefixedLetExpCS__NameAssignment_0_1"
    // InternalOCLinEcore.g:28792:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
    public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28796:1: ( ( ruleUnaryOperatorName ) )
            // InternalOCLinEcore.g:28797:1: ( ruleUnaryOperatorName )
            {
            // InternalOCLinEcore.g:28797:1: ( ruleUnaryOperatorName )
            // InternalOCLinEcore.g:28798:1: ruleUnaryOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnaryOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__NameAssignment_0_1"


    // $ANTLR start "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"
    // InternalOCLinEcore.g:28807:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
    public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28811:1: ( ( rulePrefixedLetExpCS ) )
            // InternalOCLinEcore.g:28812:1: ( rulePrefixedLetExpCS )
            {
            // InternalOCLinEcore.g:28812:1: ( rulePrefixedLetExpCS )
            // InternalOCLinEcore.g:28813:1: rulePrefixedLetExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePrefixedLetExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"
    // InternalOCLinEcore.g:28822:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
    public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28826:1: ( ( ruleUnaryOperatorName ) )
            // InternalOCLinEcore.g:28827:1: ( ruleUnaryOperatorName )
            {
            // InternalOCLinEcore.g:28827:1: ( ruleUnaryOperatorName )
            // InternalOCLinEcore.g:28828:1: ruleUnaryOperatorName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnaryOperatorName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"


    // $ANTLR start "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"
    // InternalOCLinEcore.g:28837:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
    public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28841:1: ( ( rulePrefixedPrimaryExpCS ) )
            // InternalOCLinEcore.g:28842:1: ( rulePrefixedPrimaryExpCS )
            {
            // InternalOCLinEcore.g:28842:1: ( rulePrefixedPrimaryExpCS )
            // InternalOCLinEcore.g:28843:1: rulePrefixedPrimaryExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePrefixedPrimaryExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"


    // $ANTLR start "rule__NameExpCS__OwnedPathNameAssignment_0"
    // InternalOCLinEcore.g:28852:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28856:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:28857:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:28857:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:28858:1: rulePathNameCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            rulePathNameCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__OwnedPathNameAssignment_0"


    // $ANTLR start "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"
    // InternalOCLinEcore.g:28867:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28871:1: ( ( ruleSquareBracketedClauseCS ) )
            // InternalOCLinEcore.g:28872:1: ( ruleSquareBracketedClauseCS )
            {
            // InternalOCLinEcore.g:28872:1: ( ruleSquareBracketedClauseCS )
            // InternalOCLinEcore.g:28873:1: ruleSquareBracketedClauseCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSquareBracketedClauseCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"


    // $ANTLR start "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"
    // InternalOCLinEcore.g:28882:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28886:1: ( ( ruleRoundBracketedClauseCS ) )
            // InternalOCLinEcore.g:28887:1: ( ruleRoundBracketedClauseCS )
            {
            // InternalOCLinEcore.g:28887:1: ( ruleRoundBracketedClauseCS )
            // InternalOCLinEcore.g:28888:1: ruleRoundBracketedClauseCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleRoundBracketedClauseCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"


    // $ANTLR start "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"
    // InternalOCLinEcore.g:28897:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28901:1: ( ( ruleCurlyBracketedClauseCS ) )
            // InternalOCLinEcore.g:28902:1: ( ruleCurlyBracketedClauseCS )
            {
            // InternalOCLinEcore.g:28902:1: ( ruleCurlyBracketedClauseCS )
            // InternalOCLinEcore.g:28903:1: ruleCurlyBracketedClauseCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCurlyBracketedClauseCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"


    // $ANTLR start "rule__NameExpCS__IsPreAssignment_4_0"
    // InternalOCLinEcore.g:28912:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
    public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28916:1: ( ( ( '@' ) ) )
            // InternalOCLinEcore.g:28917:1: ( ( '@' ) )
            {
            // InternalOCLinEcore.g:28917:1: ( ( '@' ) )
            // InternalOCLinEcore.g:28918:1: ( '@' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }
            // InternalOCLinEcore.g:28919:1: ( '@' )
            // InternalOCLinEcore.g:28920:1: '@'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }
            match(input,141,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NameExpCS__IsPreAssignment_4_0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"
    // InternalOCLinEcore.g:28935:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
    public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28939:1: ( ( ruleShadowPartCS ) )
            // InternalOCLinEcore.g:28940:1: ( ruleShadowPartCS )
            {
            // InternalOCLinEcore.g:28940:1: ( ruleShadowPartCS )
            // InternalOCLinEcore.g:28941:1: ruleShadowPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleShadowPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"
    // InternalOCLinEcore.g:28950:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
    public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28954:1: ( ( ruleShadowPartCS ) )
            // InternalOCLinEcore.g:28955:1: ( ruleShadowPartCS )
            {
            // InternalOCLinEcore.g:28955:1: ( ruleShadowPartCS )
            // InternalOCLinEcore.g:28956:1: ruleShadowPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleShadowPartCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"


    // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"
    // InternalOCLinEcore.g:28965:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
    public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28969:1: ( ( ruleNavigatingArgCS ) )
            // InternalOCLinEcore.g:28970:1: ( ruleNavigatingArgCS )
            {
            // InternalOCLinEcore.g:28970:1: ( ruleNavigatingArgCS )
            // InternalOCLinEcore.g:28971:1: ruleNavigatingArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingArgCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"


    // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"
    // InternalOCLinEcore.g:28980:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
    public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28984:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
            // InternalOCLinEcore.g:28985:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
            {
            // InternalOCLinEcore.g:28985:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
            // InternalOCLinEcore.g:28986:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
            }
            // InternalOCLinEcore.g:28987:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
            // InternalOCLinEcore.g:28987:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"


    // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"
    // InternalOCLinEcore.g:28996:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
    public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29000:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29001:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29001:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29002:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"


    // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"
    // InternalOCLinEcore.g:29011:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
    public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29015:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29016:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29016:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29017:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"
    // InternalOCLinEcore.g:29026:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29030:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:29031:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:29031:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:29032:1: ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"


    // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"
    // InternalOCLinEcore.g:29041:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29045:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29046:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29046:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29047:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
    // InternalOCLinEcore.g:29056:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29060:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29061:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29061:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29062:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"
    // InternalOCLinEcore.g:29071:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29075:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29076:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29076:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29077:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"
    // InternalOCLinEcore.g:29086:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29090:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29091:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29091:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29092:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"
    // InternalOCLinEcore.g:29101:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29105:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29106:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29106:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29107:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"
    // InternalOCLinEcore.g:29116:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29120:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29121:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29121:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29122:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"
    // InternalOCLinEcore.g:29131:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29135:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29136:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29136:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29137:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"


    // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"
    // InternalOCLinEcore.g:29146:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29150:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29151:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29151:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29152:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"


    // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"
    // InternalOCLinEcore.g:29161:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29165:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29166:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29166:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29167:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"


    // $ANTLR start "rule__NavigatingBarArgCS__PrefixAssignment_0"
    // InternalOCLinEcore.g:29176:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
    public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29180:1: ( ( ( '|' ) ) )
            // InternalOCLinEcore.g:29181:1: ( ( '|' ) )
            {
            // InternalOCLinEcore.g:29181:1: ( ( '|' ) )
            // InternalOCLinEcore.g:29182:1: ( '|' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }
            // InternalOCLinEcore.g:29183:1: ( '|' )
            // InternalOCLinEcore.g:29184:1: '|'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }
            match(input,142,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__PrefixAssignment_0"


    // $ANTLR start "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"
    // InternalOCLinEcore.g:29199:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29203:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:29204:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:29204:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:29205:1: ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"


    // $ANTLR start "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"
    // InternalOCLinEcore.g:29214:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29218:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29219:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29219:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29220:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"


    // $ANTLR start "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"
    // InternalOCLinEcore.g:29229:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29233:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29234:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29234:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29235:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__PrefixAssignment_0"
    // InternalOCLinEcore.g:29244:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
    public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29248:1: ( ( ( ',' ) ) )
            // InternalOCLinEcore.g:29249:1: ( ( ',' ) )
            {
            // InternalOCLinEcore.g:29249:1: ( ( ',' ) )
            // InternalOCLinEcore.g:29250:1: ( ',' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }
            // InternalOCLinEcore.g:29251:1: ( ',' )
            // InternalOCLinEcore.g:29252:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }
            match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__PrefixAssignment_0"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"
    // InternalOCLinEcore.g:29267:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29271:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:29272:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:29272:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:29273:1: ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"
    // InternalOCLinEcore.g:29282:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29286:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29287:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29287:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29288:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
    // InternalOCLinEcore.g:29297:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29301:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29302:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29302:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29303:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"
    // InternalOCLinEcore.g:29312:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29316:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29317:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29317:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29318:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"
    // InternalOCLinEcore.g:29327:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29331:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29332:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29332:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29333:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"
    // InternalOCLinEcore.g:29342:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29346:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29347:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29347:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29348:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"
    // InternalOCLinEcore.g:29357:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29361:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29362:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29362:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29363:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"
    // InternalOCLinEcore.g:29372:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29376:1: ( ( ruleCoIteratorVariableCS ) )
            // InternalOCLinEcore.g:29377:1: ( ruleCoIteratorVariableCS )
            {
            // InternalOCLinEcore.g:29377:1: ( ruleCoIteratorVariableCS )
            // InternalOCLinEcore.g:29378:1: ruleCoIteratorVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"
    // InternalOCLinEcore.g:29387:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29391:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29392:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29392:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29393:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"


    // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
    // InternalOCLinEcore.g:29402:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
    public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29406:1: ( ( ( ';' ) ) )
            // InternalOCLinEcore.g:29407:1: ( ( ';' ) )
            {
            // InternalOCLinEcore.g:29407:1: ( ( ';' ) )
            // InternalOCLinEcore.g:29408:1: ( ';' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
            }
            // InternalOCLinEcore.g:29409:1: ( ';' )
            // InternalOCLinEcore.g:29410:1: ';'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
            }
            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__PrefixAssignment_0"


    // $ANTLR start "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"
    // InternalOCLinEcore.g:29425:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29429:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:29430:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:29430:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:29431:1: ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"


    // $ANTLR start "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"
    // InternalOCLinEcore.g:29440:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29444:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29445:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29445:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29446:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"


    // $ANTLR start "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"
    // InternalOCLinEcore.g:29455:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29459:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29460:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29460:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29461:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"


    // $ANTLR start "rule__CoIteratorVariableCS__NameAssignment_0"
    // InternalOCLinEcore.g:29470:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__CoIteratorVariableCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29474:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:29475:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:29475:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:29476:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__NameAssignment_0"


    // $ANTLR start "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"
    // InternalOCLinEcore.g:29485:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29489:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29490:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29490:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29491:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"


    // $ANTLR start "rule__IfExpCS__OwnedConditionAssignment_1"
    // InternalOCLinEcore.g:29500:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
    public final void rule__IfExpCS__OwnedConditionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29504:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
            // InternalOCLinEcore.g:29505:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
            {
            // InternalOCLinEcore.g:29505:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
            // InternalOCLinEcore.g:29506:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
            }
            // InternalOCLinEcore.g:29507:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
            // InternalOCLinEcore.g:29507:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__IfExpCS__OwnedConditionAlternatives_1_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__OwnedConditionAssignment_1"


    // $ANTLR start "rule__IfExpCS__OwnedThenExpressionAssignment_3"
    // InternalOCLinEcore.g:29516:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29520:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29521:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29521:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29522:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__OwnedThenExpressionAssignment_3"


    // $ANTLR start "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"
    // InternalOCLinEcore.g:29531:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
    public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29535:1: ( ( ruleElseIfThenExpCS ) )
            // InternalOCLinEcore.g:29536:1: ( ruleElseIfThenExpCS )
            {
            // InternalOCLinEcore.g:29536:1: ( ruleElseIfThenExpCS )
            // InternalOCLinEcore.g:29537:1: ruleElseIfThenExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleElseIfThenExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"


    // $ANTLR start "rule__IfExpCS__OwnedElseExpressionAssignment_6"
    // InternalOCLinEcore.g:29546:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
    public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29550:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29551:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29551:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29552:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__IfExpCS__OwnedElseExpressionAssignment_6"


    // $ANTLR start "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"
    // InternalOCLinEcore.g:29561:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
    public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29565:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29566:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29566:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29567:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"


    // $ANTLR start "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"
    // InternalOCLinEcore.g:29576:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29580:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29581:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29581:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29582:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"


    // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_1"
    // InternalOCLinEcore.g:29591:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
    public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29595:1: ( ( ruleLetVariableCS ) )
            // InternalOCLinEcore.g:29596:1: ( ruleLetVariableCS )
            {
            // InternalOCLinEcore.g:29596:1: ( ruleLetVariableCS )
            // InternalOCLinEcore.g:29597:1: ruleLetVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__OwnedVariablesAssignment_1"


    // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_2_1"
    // InternalOCLinEcore.g:29606:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
    public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29610:1: ( ( ruleLetVariableCS ) )
            // InternalOCLinEcore.g:29611:1: ( ruleLetVariableCS )
            {
            // InternalOCLinEcore.g:29611:1: ( ruleLetVariableCS )
            // InternalOCLinEcore.g:29612:1: ruleLetVariableCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__OwnedVariablesAssignment_2_1"


    // $ANTLR start "rule__LetExpCS__OwnedInExpressionAssignment_4"
    // InternalOCLinEcore.g:29621:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
    public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29625:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29626:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29626:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29627:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetExpCS__OwnedInExpressionAssignment_4"


    // $ANTLR start "rule__LetVariableCS__NameAssignment_0"
    // InternalOCLinEcore.g:29636:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29640:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:29641:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:29641:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:29642:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__NameAssignment_0"


    // $ANTLR start "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"
    // InternalOCLinEcore.g:29651:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
    public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29655:1: ( ( ruleRoundBracketedClauseCS ) )
            // InternalOCLinEcore.g:29656:1: ( ruleRoundBracketedClauseCS )
            {
            // InternalOCLinEcore.g:29656:1: ( ruleRoundBracketedClauseCS )
            // InternalOCLinEcore.g:29657:1: ruleRoundBracketedClauseCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleRoundBracketedClauseCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"


    // $ANTLR start "rule__LetVariableCS__OwnedTypeAssignment_2_1"
    // InternalOCLinEcore.g:29666:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29670:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:29671:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:29671:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:29672:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__OwnedTypeAssignment_2_1"


    // $ANTLR start "rule__LetVariableCS__OwnedInitExpressionAssignment_4"
    // InternalOCLinEcore.g:29681:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
    public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29685:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29686:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29686:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29687:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__LetVariableCS__OwnedInitExpressionAssignment_4"


    // $ANTLR start "rule__NestedExpCS__OwnedExpressionAssignment_1"
    // InternalOCLinEcore.g:29696:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
    public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29700:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:29701:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:29701:1: ( ruleExpCS )
            // InternalOCLinEcore.g:29702:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NestedExpCS__OwnedExpressionAssignment_1"


    // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
    // InternalOCLinEcore.g:29711:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
    public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29715:1: ( ( ruleLOWER ) )
            // InternalOCLinEcore.g:29716:1: ( ruleLOWER )
            {
            // InternalOCLinEcore.g:29716:1: ( ruleLOWER )
            // InternalOCLinEcore.g:29717:1: ruleLOWER
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleLOWER();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"


    // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
    // InternalOCLinEcore.g:29726:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
    public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29730:1: ( ( ruleUPPER ) )
            // InternalOCLinEcore.g:29731:1: ( ruleUPPER )
            {
            // InternalOCLinEcore.g:29731:1: ( ruleUPPER )
            // InternalOCLinEcore.g:29732:1: ruleUPPER
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUPPER();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"


    // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
    // InternalOCLinEcore.g:29741:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
    public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29745:1: ( ( ( '|1' ) ) )
            // InternalOCLinEcore.g:29746:1: ( ( '|1' ) )
            {
            // InternalOCLinEcore.g:29746:1: ( ( '|1' ) )
            // InternalOCLinEcore.g:29747:1: ( '|1' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }
            // InternalOCLinEcore.g:29748:1: ( '|1' )
            // InternalOCLinEcore.g:29749:1: '|1'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }
            match(input,143,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityCS__IsNullFreeAssignment_2_1"


    // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
    // InternalOCLinEcore.g:29764:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
    public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29768:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
            // InternalOCLinEcore.g:29769:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
            {
            // InternalOCLinEcore.g:29769:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
            // InternalOCLinEcore.g:29770:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
            }
            // InternalOCLinEcore.g:29771:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
            // InternalOCLinEcore.g:29771:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__MultiplicityStringCS__StringBoundsAlternatives_0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__MultiplicityStringCS__StringBoundsAssignment"


    // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
    // InternalOCLinEcore.g:29780:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
    public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29784:1: ( ( ruleFirstPathElementCS ) )
            // InternalOCLinEcore.g:29785:1: ( ruleFirstPathElementCS )
            {
            // InternalOCLinEcore.g:29785:1: ( ruleFirstPathElementCS )
            // InternalOCLinEcore.g:29786:1: ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__OwnedPathElementsAssignment_0"


    // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
    // InternalOCLinEcore.g:29795:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
    public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29799:1: ( ( ruleNextPathElementCS ) )
            // InternalOCLinEcore.g:29800:1: ( ruleNextPathElementCS )
            {
            // InternalOCLinEcore.g:29800:1: ( ruleNextPathElementCS )
            // InternalOCLinEcore.g:29801:1: ruleNextPathElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNextPathElementCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__PathNameCS__OwnedPathElementsAssignment_1_1"


    // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
    // InternalOCLinEcore.g:29812:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29816:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:29817:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:29817:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:29818:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }
            // InternalOCLinEcore.g:29819:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:29820:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FirstPathElementCS__ReferredElementAssignment"


    // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
    // InternalOCLinEcore.g:29831:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
    public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29835:1: ( ( ( ruleUnreservedName ) ) )
            // InternalOCLinEcore.g:29836:1: ( ( ruleUnreservedName ) )
            {
            // InternalOCLinEcore.g:29836:1: ( ( ruleUnreservedName ) )
            // InternalOCLinEcore.g:29837:1: ( ruleUnreservedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }
            // InternalOCLinEcore.g:29838:1: ( ruleUnreservedName )
            // InternalOCLinEcore.g:29839:1: ruleUnreservedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnreservedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
            }

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__NextPathElementCS__ReferredElementAssignment"


    // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
    // InternalOCLinEcore.g:29850:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
    public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29854:1: ( ( ruleTemplateParameterSubstitutionCS ) )
            // InternalOCLinEcore.g:29855:1: ( ruleTemplateParameterSubstitutionCS )
            {
            // InternalOCLinEcore.g:29855:1: ( ruleTemplateParameterSubstitutionCS )
            // InternalOCLinEcore.g:29856:1: ruleTemplateParameterSubstitutionCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateParameterSubstitutionCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"


    // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
    // InternalOCLinEcore.g:29865:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
    public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29869:1: ( ( ruleTemplateParameterSubstitutionCS ) )
            // InternalOCLinEcore.g:29870:1: ( ruleTemplateParameterSubstitutionCS )
            {
            // InternalOCLinEcore.g:29870:1: ( ruleTemplateParameterSubstitutionCS )
            // InternalOCLinEcore.g:29871:1: ruleTemplateParameterSubstitutionCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTemplateParameterSubstitutionCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"


    // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
    // InternalOCLinEcore.g:29880:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
    public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29884:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:29885:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:29885:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:29886:1: ruleMultiplicityCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"


    // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
    // InternalOCLinEcore.g:29895:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
    public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29899:1: ( ( ruleTypeRefCS ) )
            // InternalOCLinEcore.g:29900:1: ( ruleTypeRefCS )
            {
            // InternalOCLinEcore.g:29900:1: ( ruleTypeRefCS )
            // InternalOCLinEcore.g:29901:1: ruleTypeRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"


    // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
    // InternalOCLinEcore.g:29910:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29914:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:29915:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:29915:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:29916:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__NameAssignment_0"


    // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
    // InternalOCLinEcore.g:29925:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
    public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29929:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:29930:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:29930:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:29931:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"


    // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
    // InternalOCLinEcore.g:29940:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
    public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29944:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:29945:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:29945:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:29946:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"


    // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
    // InternalOCLinEcore.g:29955:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
    public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:29959:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:29960:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:29960:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:29961:1: ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"

    // $ANTLR start synpred194_InternalOCLinEcore
    public final void synpred194_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5502:6: ( ( ruleTypeLiteralCS ) )
        // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
        {
        // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
        // InternalOCLinEcore.g:5503:1: ruleTypeLiteralCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTypeLiteralCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred194_InternalOCLinEcore

    // $ANTLR start synpred195_InternalOCLinEcore
    public final void synpred195_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5524:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
        // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
        {
        // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
        // InternalOCLinEcore.g:5525:1: ( rule__ExpCS__Group_0__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getExpCSAccess().getGroup_0());
        }
        // InternalOCLinEcore.g:5526:1: ( rule__ExpCS__Group_0__0 )
        // InternalOCLinEcore.g:5526:2: rule__ExpCS__Group_0__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__ExpCS__Group_0__0();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred195_InternalOCLinEcore

    // $ANTLR start synpred202_InternalOCLinEcore
    public final void synpred202_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5614:6: ( ( ruleTupleLiteralExpCS ) )
        // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
        {
        // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
        // InternalOCLinEcore.g:5615:1: ruleTupleLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTupleLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred202_InternalOCLinEcore

    // $ANTLR start synpred203_InternalOCLinEcore
    public final void synpred203_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5620:6: ( ( ruleMapLiteralExpCS ) )
        // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
        {
        // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
        // InternalOCLinEcore.g:5621:1: ruleMapLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleMapLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred203_InternalOCLinEcore

    // $ANTLR start synpred204_InternalOCLinEcore
    public final void synpred204_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5626:6: ( ( ruleCollectionLiteralExpCS ) )
        // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
        {
        // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
        // InternalOCLinEcore.g:5627:1: ruleCollectionLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleCollectionLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred204_InternalOCLinEcore

    // $ANTLR start synpred206_InternalOCLinEcore
    public final void synpred206_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5638:6: ( ( ruleTypeLiteralExpCS ) )
        // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
        {
        // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
        // InternalOCLinEcore.g:5639:1: ruleTypeLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTypeLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred206_InternalOCLinEcore

    // $ANTLR start synpred210_InternalOCLinEcore
    public final void synpred210_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5710:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
        // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
        {
        // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
        // InternalOCLinEcore.g:5711:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
        }
        // InternalOCLinEcore.g:5712:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
        // InternalOCLinEcore.g:5712:2: rule__NavigatingArgCS__Group_0_1_0__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__NavigatingArgCS__Group_0_1_0__0();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred210_InternalOCLinEcore

    // $ANTLR start synpred211_InternalOCLinEcore
    public final void synpred211_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5716:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
        // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
        {
        // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
        // InternalOCLinEcore.g:5717:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
        }
        // InternalOCLinEcore.g:5718:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
        // InternalOCLinEcore.g:5718:2: rule__NavigatingArgCS__Group_0_1_1__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__NavigatingArgCS__Group_0_1_1__0();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred211_InternalOCLinEcore

    // $ANTLR start synpred212_InternalOCLinEcore
    public final void synpred212_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5738:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
        // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
        {
        // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
        // InternalOCLinEcore.g:5739:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
        }
        // InternalOCLinEcore.g:5740:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
        // InternalOCLinEcore.g:5740:2: rule__NavigatingCommaArgCS__Group_2_0__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__NavigatingCommaArgCS__Group_2_0__0();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred212_InternalOCLinEcore

    // $ANTLR start synpred213_InternalOCLinEcore
    public final void synpred213_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5744:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
        // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
        {
        // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
        // InternalOCLinEcore.g:5745:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
        }
        // InternalOCLinEcore.g:5746:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
        // InternalOCLinEcore.g:5746:2: rule__NavigatingCommaArgCS__Group_2_1__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__NavigatingCommaArgCS__Group_2_1__0();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred213_InternalOCLinEcore

    // Delegated rules

    public final boolean synpred204_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred204_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 synpred194_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred194_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 synpred212_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred212_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 synpred203_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred203_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 synpred211_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred211_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 synpred213_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred213_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 synpred202_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred202_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 synpred210_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred210_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 synpred195_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred195_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 synpred206_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred206_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 DFA24 dfa24 = new DFA24(this);
    protected DFA54 dfa54 = new DFA54(this);
    protected DFA56 dfa56 = new DFA56(this);
    protected DFA60 dfa60 = new DFA60(this);
    protected DFA61 dfa61 = new DFA61(this);
    protected DFA64 dfa64 = new DFA64(this);
    protected DFA69 dfa69 = new DFA69(this);
    protected DFA125 dfa125 = new DFA125(this);
    static final String dfa_1s = "\23\uffff";
    static final String dfa_2s = "\1\7\1\25\1\7\1\27\2\7\1\uffff\1\7\1\22\3\7\1\22\2\uffff\1\22\2\uffff\1\22";
    static final String dfa_3s = "\1\71\5\152\1\uffff\6\152\2\uffff\1\52\2\uffff\1\52";
    static final String dfa_4s = "\6\uffff\1\2\6\uffff\1\1\1\5\1\uffff\1\3\1\4\1\uffff";
    static final String dfa_5s = "\23\uffff}>";
    static final String[] dfa_6s = {
            "\2\6\10\uffff\1\1\1\7\2\6\1\2\1\6\1\4\1\10\2\6\1\5\10\6\1\11\1\6\1\12\2\6\1\3\1\13\3\6\1\14\5\6\5\uffff\1\6",
            "\1\15\36\uffff\1\6\22\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\7\15\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\1\15\34\uffff\1\6\22\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\7\15\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\7\15\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "",
            "\2\16\10\uffff\43\16\1\6\1\uffff\7\16\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\1\16\21\uffff\1\20\5\uffff\1\16\3\uffff\1\17\5\uffff\1\6\22\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\2\20\10\uffff\43\20\1\6\1\uffff\7\20\7\uffff\1\20\2\uffff\1\6\36\uffff\1\20\1\uffff\1\6\1\uffff\1\6",
            "\2\21\10\uffff\43\21\1\6\1\uffff\7\21\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\2\16\10\uffff\43\16\1\6\1\uffff\7\16\12\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "\1\16\5\uffff\1\22\13\uffff\1\20\5\uffff\1\16\11\uffff\1\6\22\uffff\1\6\40\uffff\1\6\1\uffff\1\6",
            "",
            "",
            "\1\16\21\uffff\1\20\5\uffff\1\16",
            "",
            "",
            "\1\16\21\uffff\1\20\5\uffff\1\16"
    };

    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 DFA24 extends DFA {

        public DFA24(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 24;
            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 "4115:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );";
        }
    }
    static final String dfa_7s = "\57\uffff";
    static final String dfa_8s = "\2\uffff\54\1\1\uffff";
    static final String dfa_9s = "\1\4\1\uffff\54\75\1\uffff";
    static final String dfa_10s = "\1\u008c\1\uffff\54\u008d\1\uffff";
    static final String dfa_11s = "\1\uffff\1\1\54\uffff\1\2";
    static final String dfa_12s = "\57\uffff}>";
    static final String[] dfa_13s = {
            "\2\1\1\uffff\1\2\1\3\10\uffff\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\2\uffff\1\47\1\50\1\51\1\52\1\53\1\54\1\55\4\1\24\uffff\17\1\2\uffff\1\1\1\uffff\1\56\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            ""
    };

    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);

    class DFA54 extends DFA {

        public DFA54(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 54;
            this.eot = dfa_7;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_13;
        }
        public String getDescription() {
            return "5323:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );";
        }
    }
    static final String[] dfa_14s = {
            "\2\1\1\uffff\1\2\1\3\10\uffff\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\2\uffff\1\47\1\50\1\51\1\52\1\53\1\54\1\55\4\1\24\uffff\17\1\2\uffff\1\1\1\uffff\1\56\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            ""
    };
    static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);

    class DFA56 extends DFA {

        public DFA56(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 56;
            this.eot = dfa_7;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_14;
        }
        public String getDescription() {
            return "5367:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
        }
    }
    static final String dfa_15s = "\75\uffff";
    static final String dfa_16s = "\1\7\64\uffff\5\0\3\uffff";
    static final String dfa_17s = "\1\143\64\uffff\5\0\3\uffff";
    static final String dfa_18s = "\1\uffff\1\1\53\uffff\1\2\16\uffff\1\3";
    static final String dfa_19s = "\65\uffff\1\0\1\1\1\2\1\3\1\4\3\uffff}>";
    static final String[] dfa_20s = {
            "\2\1\10\uffff\43\1\2\uffff\7\1\30\uffff\12\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_15 = DFA.unpackEncodedString(dfa_15s);
    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
    static final char[] dfa_17 = DFA.unpackEncodedStringToUnsignedChars(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
    static final short[][] dfa_20 = unpackEncodedStringArray(dfa_20s);

    class DFA60 extends DFA {

        public DFA60(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 60;
            this.eot = dfa_15;
            this.eof = dfa_15;
            this.min = dfa_16;
            this.max = dfa_17;
            this.accept = dfa_18;
            this.special = dfa_19;
            this.transition = dfa_20;
        }
        public String getDescription() {
            return "5491:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA60_53 = input.LA(1);


                        int index60_53 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred194_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index60_53);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA60_54 = input.LA(1);


                        int index60_54 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred194_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index60_54);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA60_55 = input.LA(1);


                        int index60_55 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred194_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index60_55);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA60_56 = input.LA(1);


                        int index60_56 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred194_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index60_56);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA60_57 = input.LA(1);


                        int index60_57 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred194_InternalOCLinEcore()) ) {s = 45;}

                        else if ( (true) ) {s = 60;}


                        input.seek(index60_57);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 60, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_21s = "\113\uffff";
    static final String dfa_22s = "\1\4\3\0\107\uffff";
    static final String dfa_23s = "\1\u008c\3\0\107\uffff";
    static final String dfa_24s = "\4\uffff\1\1\105\uffff\1\2";
    static final String dfa_25s = "\1\uffff\1\0\1\1\1\2\107\uffff}>";
    static final String[] dfa_26s = {
            "\2\4\1\uffff\2\4\10\uffff\43\4\2\uffff\7\4\1\1\1\2\1\3\1\4\24\uffff\17\4\2\uffff\1\4\11\uffff\1\4\1\uffff\2\4\4\uffff\1\4\4\uffff\1\112\1\4\14\uffff\2\4",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);

    class DFA61 extends DFA {

        public DFA61(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 61;
            this.eot = dfa_21;
            this.eof = dfa_21;
            this.min = dfa_22;
            this.max = dfa_23;
            this.accept = dfa_24;
            this.special = dfa_25;
            this.transition = dfa_26;
        }
        public String getDescription() {
            return "5519:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA61_1 = input.LA(1);


                        int index61_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred195_InternalOCLinEcore()) ) {s = 4;}

                        else if ( (true) ) {s = 74;}


                        input.seek(index61_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA61_2 = input.LA(1);


                        int index61_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred195_InternalOCLinEcore()) ) {s = 4;}

                        else if ( (true) ) {s = 74;}


                        input.seek(index61_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA61_3 = input.LA(1);


                        int index61_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred195_InternalOCLinEcore()) ) {s = 4;}

                        else if ( (true) ) {s = 74;}


                        input.seek(index61_3);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 61, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_27s = "\112\uffff";
    static final String dfa_28s = "\1\4\12\uffff\7\0\70\uffff";
    static final String dfa_29s = "\1\u008c\12\uffff\7\0\70\uffff";
    static final String dfa_30s = "\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_31s = "\13\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\70\uffff}>";
    static final String[] dfa_32s = {
            "\2\4\1\uffff\2\33\10\uffff\43\33\2\uffff\7\33\3\uffff\1\4\24\uffff\1\14\1\13\10\23\1\15\1\16\1\17\1\20\1\21\2\uffff\1\1\11\uffff\1\22\1\uffff\2\4\4\uffff\1\2\5\uffff\1\3\14\uffff\2\4",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final char[] dfa_28 = DFA.unpackEncodedStringToUnsignedChars(dfa_28s);
    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
    static final short[] dfa_30 = DFA.unpackEncodedString(dfa_30s);
    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final short[][] dfa_32 = unpackEncodedStringArray(dfa_32s);

    class DFA64 extends DFA {

        public DFA64(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 64;
            this.eot = dfa_27;
            this.eof = dfa_27;
            this.min = dfa_28;
            this.max = dfa_29;
            this.accept = dfa_30;
            this.special = dfa_31;
            this.transition = dfa_32;
        }
        public String getDescription() {
            return "5585:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA64_11 = input.LA(1);


                        int index64_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred202_InternalOCLinEcore()) ) {s = 71;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_11);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA64_12 = input.LA(1);


                        int index64_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred203_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_12);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA64_13 = input.LA(1);


                        int index64_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred204_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_13);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA64_14 = input.LA(1);


                        int index64_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred204_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_14);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA64_15 = input.LA(1);


                        int index64_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred204_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_15);
                        if ( s>=0 ) return s;
                        break;
                    case 5 :
                        int LA64_16 = input.LA(1);


                        int index64_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred204_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_16);
                        if ( s>=0 ) return s;
                        break;
                    case 6 :
                        int LA64_17 = input.LA(1);


                        int index64_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred204_InternalOCLinEcore()) ) {s = 73;}

                        else if ( (synpred206_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index64_17);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 64, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_33s = {
            "\2\1\1\uffff\1\2\1\3\10\uffff\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\45\1\46\2\uffff\1\47\1\50\1\51\1\52\1\53\1\54\1\55\4\1\24\uffff\17\1\2\uffff\1\1\1\uffff\1\56\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\2\uffff\25\1\21\uffff\1\1\1\uffff\1\56\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            ""
    };
    static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);

    class DFA69 extends DFA {

        public DFA69(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 69;
            this.eot = dfa_7;
            this.eof = dfa_7;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_33;
        }
        public String getDescription() {
            return "5761:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
        }
    }
    static final String dfa_34s = "\1\5\54\64\2\uffff";
    static final String dfa_35s = "\1\74\54\u0088\2\uffff";
    static final String dfa_36s = "\55\uffff\1\2\1\1";
    static final String[] dfa_37s = {
            "\1\55\1\uffff\1\1\1\2\10\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\25\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\2\uffff\1\46\1\47\1\50\1\51\1\52\1\53\1\54",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "\1\55\63\uffff\1\56\4\uffff\1\55\32\uffff\1\55",
            "",
            ""
    };
    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
    static final short[][] dfa_37 = unpackEncodedStringArray(dfa_37s);

    class DFA125 extends DFA {

        public DFA125(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 125;
            this.eot = dfa_7;
            this.eof = dfa_7;
            this.min = dfa_34;
            this.max = dfa_35;
            this.accept = dfa_36;
            this.special = dfa_12;
            this.transition = dfa_37;
        }
        public String getDescription() {
            return "10504:1: ( rule__ImportCS__Group_1__0 )?";
        }
    }



    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[]{0x0000000000000022L});
        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000004C40000000L});
        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000440000002L});
        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000004000000002L});
        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x1FCFFFFFFFFE0180L});
        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000010L});
        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0100000000000000L});
        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x1FDFFFFFFFFE0180L,0x0000010000000000L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0xFFCFFFFFFFFE03B0L,0x610D004FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0xFFDFFFFFFFFE03B0L,0x610D004FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x1FCFFFFFFFFE0180L,0x0000010000000000L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0040000000000000L});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x1FDFFFFFFFFE01A0L,0x0000044000000000L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x1FCFFFFFFFFE01A0L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000028000000000L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x12CFFFFFFFFE0180L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x12CFFFFFFFFE0182L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000400001040000L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0010000000000000L,0x0000050000000080L});
        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000001000000L});
        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000400000000000L});
        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x410D004FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000020L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x000F082024000000L,0x0000000000000000L,0x00000000000000FFL});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x000F082024000002L,0x0000000000000000L,0x00000000000000FFL});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x10C0000082000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x10C0000082000002L});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000020000800000L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0010000000000000L,0x0000054000000010L});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0820000000000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x11C0000000100000L,0x0000080000000000L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x11C0000000100002L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000000060L});
        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000062L});
        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0080000000000000L});
        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0010000000000020L,0x0000004000000000L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x13CFFFFFFFFE0180L,0x0000080000000000L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x13CFFFFFFFFE0182L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x2000000000000010L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x10C0000000000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x10C0000000000002L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0010000000000000L,0x0000000000000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0010000000000000L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000401001000000L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x1FCFFFFFFFFE0180L,0x0000004000000010L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x1FCFFFFFFFFE0180L,0x0000008000000000L});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0010800000000000L,0x0000050000000000L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0003002004000000L,0x0000000000000000L,0x0000000000000035L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0003002004000002L,0x0000000000000000L,0x0000000000000035L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x10C0018000080000L,0x0000080000000000L});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x10C0018000080002L});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x10C0024008A20000L,0x0000080000000000L});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x10C0024008A20002L});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000050000000000L});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0002002000000000L,0x0000000000000000L,0x0000000000000024L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0002002000000002L,0x0000000000000000L,0x0000000000000024L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x020FFFFFFFFE0180L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0010000000000000L,0x0000150000000080L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x000F282004400000L,0x0000000000000000L,0x00000000000006FDL});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x000F282004400002L,0x0000000000000000L,0x00000000000006FDL});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x14C0000282000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x14C0000282000002L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0010000000000000L,0x0000020000000000L});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000220000L});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0010000010000000L,0x0000054000000010L});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000100000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x10C0000000000000L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x1FCFFFFFFFFE01A0L,0x0000040000000000L});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x1FCFFFFFFFFE01A0L,0x0000080000000000L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x1FCFFFFFFFFE01A2L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000008L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000010L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x410D006FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x1FCFFFFFFFFE0180L,0x0000000FFFE00000L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0020008000000000L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x610D094FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x610D014FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x610D004FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000000L,0x0000820000000000L});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000180L});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x610D084FFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000000L,0x00000A0000000000L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000080L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000030L,0x000C000000000001L,0x0000000000001800L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x2000000000000000L,0x00000000001FFFFFL});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0xE000000000000000L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0020044000000000L,0x0000000000002000L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0020000000000000L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0xFFCFFFFFFFFE01B0L,0x610D01CFFFE00001L,0x0000000000001800L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0010000000000000L,0x0000020000000000L,0x0000000000004000L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0010000000000002L,0x0000020000000000L,0x0000000000004000L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0040020000000000L});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000000L,0x0082010000000000L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000080L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000000L,0x0200000000000000L});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000000L,0x1400000000000000L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000002L,0x1000000000000000L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x0080020000000000L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0000014000000080L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000001L});
        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000010L,0x0000002000000005L});
        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000000L,0x0040001000000000L,0x0000000000008000L});
        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000000000L,0x0020020000000000L});
        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000010000000L});
        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000002L,0x8000000000000000L});
    }


}