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, 2016 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     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'", "'serializable'", "'sysml'", "'-'", "'not'", "'*'", "'/'", "'+'", "'>'", "'<'", "'>='", "'<='", "'='", "'<>'", "'and'", "'or'", "'xor'", "'implies'", "'.'", "'->'", "'?.'", "'?->'", "'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__50=50;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__54=54;
    public static final int T__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 "entryRuleReferenceCS"
    // InternalOCLinEcore.g:658:1: entryRuleReferenceCS : ruleReferenceCS EOF ;
    public final void entryRuleReferenceCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:659:1: ( ruleReferenceCS EOF )
            // InternalOCLinEcore.g:660: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:667:1: ruleReferenceCS : ( ( rule__ReferenceCS__Group__0 ) ) ;
    public final void ruleReferenceCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:671:2: ( ( ( rule__ReferenceCS__Group__0 ) ) )
            // InternalOCLinEcore.g:672:1: ( ( rule__ReferenceCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:672:1: ( ( rule__ReferenceCS__Group__0 ) )
            // InternalOCLinEcore.g:673:1: ( rule__ReferenceCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:674:1: ( rule__ReferenceCS__Group__0 )
            // InternalOCLinEcore.g:674: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:686:1: entryRuleSpecificationCS : ruleSpecificationCS EOF ;
    public final void entryRuleSpecificationCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:687:1: ( ruleSpecificationCS EOF )
            // InternalOCLinEcore.g:688: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:695:1: ruleSpecificationCS : ( ( rule__SpecificationCS__Alternatives ) ) ;
    public final void ruleSpecificationCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:699:2: ( ( ( rule__SpecificationCS__Alternatives ) ) )
            // InternalOCLinEcore.g:700:1: ( ( rule__SpecificationCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:700:1: ( ( rule__SpecificationCS__Alternatives ) )
            // InternalOCLinEcore.g:701:1: ( rule__SpecificationCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSpecificationCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:702:1: ( rule__SpecificationCS__Alternatives )
            // InternalOCLinEcore.g:702: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:714:1: entryRuleStructuredClassCS : ruleStructuredClassCS EOF ;
    public final void entryRuleStructuredClassCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:715:1: ( ruleStructuredClassCS EOF )
            // InternalOCLinEcore.g:716: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:723:1: ruleStructuredClassCS : ( ( rule__StructuredClassCS__Group__0 ) ) ;
    public final void ruleStructuredClassCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:727:2: ( ( ( rule__StructuredClassCS__Group__0 ) ) )
            // InternalOCLinEcore.g:728:1: ( ( rule__StructuredClassCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:728:1: ( ( rule__StructuredClassCS__Group__0 ) )
            // InternalOCLinEcore.g:729:1: ( rule__StructuredClassCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:730:1: ( rule__StructuredClassCS__Group__0 )
            // InternalOCLinEcore.g:730: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:742:1: entryRuleStructuralFeatureCS : ruleStructuralFeatureCS EOF ;
    public final void entryRuleStructuralFeatureCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:743:1: ( ruleStructuralFeatureCS EOF )
            // InternalOCLinEcore.g:744: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:751:1: ruleStructuralFeatureCS : ( ( rule__StructuralFeatureCS__Alternatives ) ) ;
    public final void ruleStructuralFeatureCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:755:2: ( ( ( rule__StructuralFeatureCS__Alternatives ) ) )
            // InternalOCLinEcore.g:756:1: ( ( rule__StructuralFeatureCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:756:1: ( ( rule__StructuralFeatureCS__Alternatives ) )
            // InternalOCLinEcore.g:757:1: ( rule__StructuralFeatureCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuralFeatureCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:758:1: ( rule__StructuralFeatureCS__Alternatives )
            // InternalOCLinEcore.g:758: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:770:1: entryRuleSysMLCS : ruleSysMLCS EOF ;
    public final void entryRuleSysMLCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:771:1: ( ruleSysMLCS EOF )
            // InternalOCLinEcore.g:772: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:779:1: ruleSysMLCS : ( ( rule__SysMLCS__Group__0 ) ) ;
    public final void ruleSysMLCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:783:2: ( ( ( rule__SysMLCS__Group__0 ) ) )
            // InternalOCLinEcore.g:784:1: ( ( rule__SysMLCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:784:1: ( ( rule__SysMLCS__Group__0 ) )
            // InternalOCLinEcore.g:785:1: ( rule__SysMLCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:786:1: ( rule__SysMLCS__Group__0 )
            // InternalOCLinEcore.g:786: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:800:1: entryRuleTypedMultiplicityRefCS : ruleTypedMultiplicityRefCS EOF ;
    public final void entryRuleTypedMultiplicityRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:801:1: ( ruleTypedMultiplicityRefCS EOF )
            // InternalOCLinEcore.g:802: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:809:1: ruleTypedMultiplicityRefCS : ( ( rule__TypedMultiplicityRefCS__Group__0 ) ) ;
    public final void ruleTypedMultiplicityRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:813:2: ( ( ( rule__TypedMultiplicityRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:814:1: ( ( rule__TypedMultiplicityRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:814:1: ( ( rule__TypedMultiplicityRefCS__Group__0 ) )
            // InternalOCLinEcore.g:815:1: ( rule__TypedMultiplicityRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:816:1: ( rule__TypedMultiplicityRefCS__Group__0 )
            // InternalOCLinEcore.g:816: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:828:1: entryRuleTemplateSignatureCS : ruleTemplateSignatureCS EOF ;
    public final void entryRuleTemplateSignatureCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:829:1: ( ruleTemplateSignatureCS EOF )
            // InternalOCLinEcore.g:830: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:837:1: ruleTemplateSignatureCS : ( ( rule__TemplateSignatureCS__Alternatives ) ) ;
    public final void ruleTemplateSignatureCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:841:2: ( ( ( rule__TemplateSignatureCS__Alternatives ) ) )
            // InternalOCLinEcore.g:842:1: ( ( rule__TemplateSignatureCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:842:1: ( ( rule__TemplateSignatureCS__Alternatives ) )
            // InternalOCLinEcore.g:843:1: ( rule__TemplateSignatureCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:844:1: ( rule__TemplateSignatureCS__Alternatives )
            // InternalOCLinEcore.g:844: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:856:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
    public final void entryRuleTypedRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:857:1: ( ruleTypedRefCS EOF )
            // InternalOCLinEcore.g:858: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:865:1: ruleTypedRefCS : ( ( rule__TypedRefCS__Alternatives ) ) ;
    public final void ruleTypedRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:869:2: ( ( ( rule__TypedRefCS__Alternatives ) ) )
            // InternalOCLinEcore.g:870:1: ( ( rule__TypedRefCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:870:1: ( ( rule__TypedRefCS__Alternatives ) )
            // InternalOCLinEcore.g:871:1: ( rule__TypedRefCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedRefCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:872:1: ( rule__TypedRefCS__Alternatives )
            // InternalOCLinEcore.g:872: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:884:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
    public final void entryRuleTypedTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:885:1: ( ruleTypedTypeRefCS EOF )
            // InternalOCLinEcore.g:886: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:893:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
    public final void ruleTypedTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:897:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:898:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:898:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
            // InternalOCLinEcore.g:899:1: ( rule__TypedTypeRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:900:1: ( rule__TypedTypeRefCS__Group__0 )
            // InternalOCLinEcore.g:900: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:912:1: entryRuleUnrestrictedName : ruleUnrestrictedName EOF ;
    public final void entryRuleUnrestrictedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:913:1: ( ruleUnrestrictedName EOF )
            // InternalOCLinEcore.g:914: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:921:1: ruleUnrestrictedName : ( ( rule__UnrestrictedName__Alternatives ) ) ;
    public final void ruleUnrestrictedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:925:2: ( ( ( rule__UnrestrictedName__Alternatives ) ) )
            // InternalOCLinEcore.g:926:1: ( ( rule__UnrestrictedName__Alternatives ) )
            {
            // InternalOCLinEcore.g:926:1: ( ( rule__UnrestrictedName__Alternatives ) )
            // InternalOCLinEcore.g:927:1: ( rule__UnrestrictedName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnrestrictedNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:928:1: ( rule__UnrestrictedName__Alternatives )
            // InternalOCLinEcore.g:928: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:944:1: entryRuleEssentialOCLUnaryOperatorName : ruleEssentialOCLUnaryOperatorName EOF ;
    public final void entryRuleEssentialOCLUnaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:945:1: ( ruleEssentialOCLUnaryOperatorName EOF )
            // InternalOCLinEcore.g:946: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:953:1: ruleEssentialOCLUnaryOperatorName : ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLUnaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:957:2: ( ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:958:1: ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:958:1: ( ( rule__EssentialOCLUnaryOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:959:1: ( rule__EssentialOCLUnaryOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:960:1: ( rule__EssentialOCLUnaryOperatorName__Alternatives )
            // InternalOCLinEcore.g:960: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:972:1: entryRuleEssentialOCLInfixOperatorName : ruleEssentialOCLInfixOperatorName EOF ;
    public final void entryRuleEssentialOCLInfixOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:973:1: ( ruleEssentialOCLInfixOperatorName EOF )
            // InternalOCLinEcore.g:974: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:981:1: ruleEssentialOCLInfixOperatorName : ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLInfixOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:985:2: ( ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:986:1: ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:986:1: ( ( rule__EssentialOCLInfixOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:987:1: ( rule__EssentialOCLInfixOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:988:1: ( rule__EssentialOCLInfixOperatorName__Alternatives )
            // InternalOCLinEcore.g:988: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:1000:1: entryRuleEssentialOCLNavigationOperatorName : ruleEssentialOCLNavigationOperatorName EOF ;
    public final void entryRuleEssentialOCLNavigationOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1001:1: ( ruleEssentialOCLNavigationOperatorName EOF )
            // InternalOCLinEcore.g:1002: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:1009:1: ruleEssentialOCLNavigationOperatorName : ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) ) ;
    public final void ruleEssentialOCLNavigationOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1013:2: ( ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:1014:1: ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1014:1: ( ( rule__EssentialOCLNavigationOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:1015:1: ( rule__EssentialOCLNavigationOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1016:1: ( rule__EssentialOCLNavigationOperatorName__Alternatives )
            // InternalOCLinEcore.g:1016: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:1028:1: entryRuleBinaryOperatorName : ruleBinaryOperatorName EOF ;
    public final void entryRuleBinaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1029:1: ( ruleBinaryOperatorName EOF )
            // InternalOCLinEcore.g:1030: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:1037:1: ruleBinaryOperatorName : ( ( rule__BinaryOperatorName__Alternatives ) ) ;
    public final void ruleBinaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1041:2: ( ( ( rule__BinaryOperatorName__Alternatives ) ) )
            // InternalOCLinEcore.g:1042:1: ( ( rule__BinaryOperatorName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1042:1: ( ( rule__BinaryOperatorName__Alternatives ) )
            // InternalOCLinEcore.g:1043:1: ( rule__BinaryOperatorName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBinaryOperatorNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1044:1: ( rule__BinaryOperatorName__Alternatives )
            // InternalOCLinEcore.g:1044: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:1056:1: entryRuleInfixOperatorName : ruleInfixOperatorName EOF ;
    public final void entryRuleInfixOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1057:1: ( ruleInfixOperatorName EOF )
            // InternalOCLinEcore.g:1058: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:1065:1: ruleInfixOperatorName : ( ruleEssentialOCLInfixOperatorName ) ;
    public final void ruleInfixOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1069:2: ( ( ruleEssentialOCLInfixOperatorName ) )
            // InternalOCLinEcore.g:1070:1: ( ruleEssentialOCLInfixOperatorName )
            {
            // InternalOCLinEcore.g:1070:1: ( ruleEssentialOCLInfixOperatorName )
            // InternalOCLinEcore.g:1071: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:1084:1: entryRuleNavigationOperatorName : ruleNavigationOperatorName EOF ;
    public final void entryRuleNavigationOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1085:1: ( ruleNavigationOperatorName EOF )
            // InternalOCLinEcore.g:1086: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:1093:1: ruleNavigationOperatorName : ( ruleEssentialOCLNavigationOperatorName ) ;
    public final void ruleNavigationOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1097:2: ( ( ruleEssentialOCLNavigationOperatorName ) )
            // InternalOCLinEcore.g:1098:1: ( ruleEssentialOCLNavigationOperatorName )
            {
            // InternalOCLinEcore.g:1098:1: ( ruleEssentialOCLNavigationOperatorName )
            // InternalOCLinEcore.g:1099: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:1112:1: entryRuleUnaryOperatorName : ruleUnaryOperatorName EOF ;
    public final void entryRuleUnaryOperatorName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1113:1: ( ruleUnaryOperatorName EOF )
            // InternalOCLinEcore.g:1114: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:1121:1: ruleUnaryOperatorName : ( ruleEssentialOCLUnaryOperatorName ) ;
    public final void ruleUnaryOperatorName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1125:2: ( ( ruleEssentialOCLUnaryOperatorName ) )
            // InternalOCLinEcore.g:1126:1: ( ruleEssentialOCLUnaryOperatorName )
            {
            // InternalOCLinEcore.g:1126:1: ( ruleEssentialOCLUnaryOperatorName )
            // InternalOCLinEcore.g:1127: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:1140:1: entryRuleEssentialOCLUnrestrictedName : ruleEssentialOCLUnrestrictedName EOF ;
    public final void entryRuleEssentialOCLUnrestrictedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1141:1: ( ruleEssentialOCLUnrestrictedName EOF )
            // InternalOCLinEcore.g:1142: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:1149:1: ruleEssentialOCLUnrestrictedName : ( ruleIdentifier ) ;
    public final void ruleEssentialOCLUnrestrictedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1153:2: ( ( ruleIdentifier ) )
            // InternalOCLinEcore.g:1154:1: ( ruleIdentifier )
            {
            // InternalOCLinEcore.g:1154:1: ( ruleIdentifier )
            // InternalOCLinEcore.g:1155: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:1168:1: entryRuleEssentialOCLUnreservedName : ruleEssentialOCLUnreservedName EOF ;
    public final void entryRuleEssentialOCLUnreservedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1169:1: ( ruleEssentialOCLUnreservedName EOF )
            // InternalOCLinEcore.g:1170: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:1177:1: ruleEssentialOCLUnreservedName : ( ( rule__EssentialOCLUnreservedName__Alternatives ) ) ;
    public final void ruleEssentialOCLUnreservedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1181:2: ( ( ( rule__EssentialOCLUnreservedName__Alternatives ) ) )
            // InternalOCLinEcore.g:1182:1: ( ( rule__EssentialOCLUnreservedName__Alternatives ) )
            {
            // InternalOCLinEcore.g:1182:1: ( ( rule__EssentialOCLUnreservedName__Alternatives ) )
            // InternalOCLinEcore.g:1183:1: ( rule__EssentialOCLUnreservedName__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEssentialOCLUnreservedNameAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1184:1: ( rule__EssentialOCLUnreservedName__Alternatives )
            // InternalOCLinEcore.g:1184: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:1196:1: entryRuleUnreservedName : ruleUnreservedName EOF ;
    public final void entryRuleUnreservedName() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1197:1: ( ruleUnreservedName EOF )
            // InternalOCLinEcore.g:1198: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:1205:1: ruleUnreservedName : ( ruleEssentialOCLUnreservedName ) ;
    public final void ruleUnreservedName() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1209:2: ( ( ruleEssentialOCLUnreservedName ) )
            // InternalOCLinEcore.g:1210:1: ( ruleEssentialOCLUnreservedName )
            {
            // InternalOCLinEcore.g:1210:1: ( ruleEssentialOCLUnreservedName )
            // InternalOCLinEcore.g:1211: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:1224:1: entryRuleURIPathNameCS : ruleURIPathNameCS EOF ;
    public final void entryRuleURIPathNameCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1225:1: ( ruleURIPathNameCS EOF )
            // InternalOCLinEcore.g:1226: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:1233:1: ruleURIPathNameCS : ( ( rule__URIPathNameCS__Group__0 ) ) ;
    public final void ruleURIPathNameCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1237:2: ( ( ( rule__URIPathNameCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1238:1: ( ( rule__URIPathNameCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1238:1: ( ( rule__URIPathNameCS__Group__0 ) )
            // InternalOCLinEcore.g:1239:1: ( rule__URIPathNameCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1240:1: ( rule__URIPathNameCS__Group__0 )
            // InternalOCLinEcore.g:1240: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:1252:1: entryRuleURIFirstPathElementCS : ruleURIFirstPathElementCS EOF ;
    public final void entryRuleURIFirstPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1253:1: ( ruleURIFirstPathElementCS EOF )
            // InternalOCLinEcore.g:1254: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:1261:1: ruleURIFirstPathElementCS : ( ( rule__URIFirstPathElementCS__Alternatives ) ) ;
    public final void ruleURIFirstPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1265:2: ( ( ( rule__URIFirstPathElementCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1266:1: ( ( rule__URIFirstPathElementCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1266:1: ( ( rule__URIFirstPathElementCS__Alternatives ) )
            // InternalOCLinEcore.g:1267:1: ( rule__URIFirstPathElementCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1268:1: ( rule__URIFirstPathElementCS__Alternatives )
            // InternalOCLinEcore.g:1268: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:1280:1: entryRulePrimitiveTypeIdentifier : rulePrimitiveTypeIdentifier EOF ;
    public final void entryRulePrimitiveTypeIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1281:1: ( rulePrimitiveTypeIdentifier EOF )
            // InternalOCLinEcore.g:1282: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:1289:1: rulePrimitiveTypeIdentifier : ( ( rule__PrimitiveTypeIdentifier__Alternatives ) ) ;
    public final void rulePrimitiveTypeIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1293:2: ( ( ( rule__PrimitiveTypeIdentifier__Alternatives ) ) )
            // InternalOCLinEcore.g:1294:1: ( ( rule__PrimitiveTypeIdentifier__Alternatives ) )
            {
            // InternalOCLinEcore.g:1294:1: ( ( rule__PrimitiveTypeIdentifier__Alternatives ) )
            // InternalOCLinEcore.g:1295:1: ( rule__PrimitiveTypeIdentifier__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeIdentifierAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1296:1: ( rule__PrimitiveTypeIdentifier__Alternatives )
            // InternalOCLinEcore.g:1296: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:1308:1: entryRulePrimitiveTypeCS : rulePrimitiveTypeCS EOF ;
    public final void entryRulePrimitiveTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1309:1: ( rulePrimitiveTypeCS EOF )
            // InternalOCLinEcore.g:1310: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:1317:1: rulePrimitiveTypeCS : ( ( rule__PrimitiveTypeCS__NameAssignment ) ) ;
    public final void rulePrimitiveTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1321:2: ( ( ( rule__PrimitiveTypeCS__NameAssignment ) ) )
            // InternalOCLinEcore.g:1322:1: ( ( rule__PrimitiveTypeCS__NameAssignment ) )
            {
            // InternalOCLinEcore.g:1322:1: ( ( rule__PrimitiveTypeCS__NameAssignment ) )
            // InternalOCLinEcore.g:1323:1: ( rule__PrimitiveTypeCS__NameAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveTypeCSAccess().getNameAssignment());
            }
            // InternalOCLinEcore.g:1324:1: ( rule__PrimitiveTypeCS__NameAssignment )
            // InternalOCLinEcore.g:1324: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:1336:1: entryRuleCollectionTypeIdentifier : ruleCollectionTypeIdentifier EOF ;
    public final void entryRuleCollectionTypeIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1337:1: ( ruleCollectionTypeIdentifier EOF )
            // InternalOCLinEcore.g:1338: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:1345:1: ruleCollectionTypeIdentifier : ( ( rule__CollectionTypeIdentifier__Alternatives ) ) ;
    public final void ruleCollectionTypeIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1349:2: ( ( ( rule__CollectionTypeIdentifier__Alternatives ) ) )
            // InternalOCLinEcore.g:1350:1: ( ( rule__CollectionTypeIdentifier__Alternatives ) )
            {
            // InternalOCLinEcore.g:1350:1: ( ( rule__CollectionTypeIdentifier__Alternatives ) )
            // InternalOCLinEcore.g:1351:1: ( rule__CollectionTypeIdentifier__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeIdentifierAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1352:1: ( rule__CollectionTypeIdentifier__Alternatives )
            // InternalOCLinEcore.g:1352: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:1364:1: entryRuleCollectionTypeCS : ruleCollectionTypeCS EOF ;
    public final void entryRuleCollectionTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1365:1: ( ruleCollectionTypeCS EOF )
            // InternalOCLinEcore.g:1366: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:1373:1: ruleCollectionTypeCS : ( ( rule__CollectionTypeCS__Group__0 ) ) ;
    public final void ruleCollectionTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1377:2: ( ( ( rule__CollectionTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1378:1: ( ( rule__CollectionTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1378:1: ( ( rule__CollectionTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1379:1: ( rule__CollectionTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1380:1: ( rule__CollectionTypeCS__Group__0 )
            // InternalOCLinEcore.g:1380: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:1392:1: entryRuleMapTypeCS : ruleMapTypeCS EOF ;
    public final void entryRuleMapTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1393:1: ( ruleMapTypeCS EOF )
            // InternalOCLinEcore.g:1394: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:1401:1: ruleMapTypeCS : ( ( rule__MapTypeCS__Group__0 ) ) ;
    public final void ruleMapTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1405:2: ( ( ( rule__MapTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1406:1: ( ( rule__MapTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1406:1: ( ( rule__MapTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1407:1: ( rule__MapTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1408:1: ( rule__MapTypeCS__Group__0 )
            // InternalOCLinEcore.g:1408: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:1420:1: entryRuleTupleTypeCS : ruleTupleTypeCS EOF ;
    public final void entryRuleTupleTypeCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1421:1: ( ruleTupleTypeCS EOF )
            // InternalOCLinEcore.g:1422: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:1429:1: ruleTupleTypeCS : ( ( rule__TupleTypeCS__Group__0 ) ) ;
    public final void ruleTupleTypeCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1433:2: ( ( ( rule__TupleTypeCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1434:1: ( ( rule__TupleTypeCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1434:1: ( ( rule__TupleTypeCS__Group__0 ) )
            // InternalOCLinEcore.g:1435:1: ( rule__TupleTypeCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1436:1: ( rule__TupleTypeCS__Group__0 )
            // InternalOCLinEcore.g:1436: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:1448:1: entryRuleTuplePartCS : ruleTuplePartCS EOF ;
    public final void entryRuleTuplePartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1449:1: ( ruleTuplePartCS EOF )
            // InternalOCLinEcore.g:1450: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:1457:1: ruleTuplePartCS : ( ( rule__TuplePartCS__Group__0 ) ) ;
    public final void ruleTuplePartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1461:2: ( ( ( rule__TuplePartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1462:1: ( ( rule__TuplePartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1462:1: ( ( rule__TuplePartCS__Group__0 ) )
            // InternalOCLinEcore.g:1463:1: ( rule__TuplePartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1464:1: ( rule__TuplePartCS__Group__0 )
            // InternalOCLinEcore.g:1464: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:1476:1: entryRuleCollectionLiteralExpCS : ruleCollectionLiteralExpCS EOF ;
    public final void entryRuleCollectionLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1477:1: ( ruleCollectionLiteralExpCS EOF )
            // InternalOCLinEcore.g:1478: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:1485:1: ruleCollectionLiteralExpCS : ( ( rule__CollectionLiteralExpCS__Group__0 ) ) ;
    public final void ruleCollectionLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1489:2: ( ( ( rule__CollectionLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1490:1: ( ( rule__CollectionLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1490:1: ( ( rule__CollectionLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1491:1: ( rule__CollectionLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1492:1: ( rule__CollectionLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1492: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:1504:1: entryRuleCollectionLiteralPartCS : ruleCollectionLiteralPartCS EOF ;
    public final void entryRuleCollectionLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1505:1: ( ruleCollectionLiteralPartCS EOF )
            // InternalOCLinEcore.g:1506: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:1513:1: ruleCollectionLiteralPartCS : ( ( rule__CollectionLiteralPartCS__Alternatives ) ) ;
    public final void ruleCollectionLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1517:2: ( ( ( rule__CollectionLiteralPartCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1518:1: ( ( rule__CollectionLiteralPartCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1518:1: ( ( rule__CollectionLiteralPartCS__Alternatives ) )
            // InternalOCLinEcore.g:1519:1: ( rule__CollectionLiteralPartCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1520:1: ( rule__CollectionLiteralPartCS__Alternatives )
            // InternalOCLinEcore.g:1520: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:1532:1: entryRuleCollectionPatternCS : ruleCollectionPatternCS EOF ;
    public final void entryRuleCollectionPatternCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1533:1: ( ruleCollectionPatternCS EOF )
            // InternalOCLinEcore.g:1534: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:1541:1: ruleCollectionPatternCS : ( ( rule__CollectionPatternCS__Group__0 ) ) ;
    public final void ruleCollectionPatternCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1545:2: ( ( ( rule__CollectionPatternCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1546:1: ( ( rule__CollectionPatternCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1546:1: ( ( rule__CollectionPatternCS__Group__0 ) )
            // InternalOCLinEcore.g:1547:1: ( rule__CollectionPatternCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1548:1: ( rule__CollectionPatternCS__Group__0 )
            // InternalOCLinEcore.g:1548: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:1560:1: entryRuleShadowPartCS : ruleShadowPartCS EOF ;
    public final void entryRuleShadowPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1561:1: ( ruleShadowPartCS EOF )
            // InternalOCLinEcore.g:1562: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:1569:1: ruleShadowPartCS : ( ( rule__ShadowPartCS__Group__0 ) ) ;
    public final void ruleShadowPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1573:2: ( ( ( rule__ShadowPartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1574:1: ( ( rule__ShadowPartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1574:1: ( ( rule__ShadowPartCS__Group__0 ) )
            // InternalOCLinEcore.g:1575:1: ( rule__ShadowPartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1576:1: ( rule__ShadowPartCS__Group__0 )
            // InternalOCLinEcore.g:1576:2: rule__ShadowPartCS__Group__0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group__0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "entryRulePatternExpCS"
    // InternalOCLinEcore.g:1588:1: entryRulePatternExpCS : rulePatternExpCS EOF ;
    public final void entryRulePatternExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1589:1: ( rulePatternExpCS EOF )
            // InternalOCLinEcore.g:1590: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:1597:1: rulePatternExpCS : ( ( rule__PatternExpCS__Group__0 ) ) ;
    public final void rulePatternExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1601:2: ( ( ( rule__PatternExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1602:1: ( ( rule__PatternExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1602:1: ( ( rule__PatternExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1603:1: ( rule__PatternExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1604:1: ( rule__PatternExpCS__Group__0 )
            // InternalOCLinEcore.g:1604: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:1616:1: entryRuleLambdaLiteralExpCS : ruleLambdaLiteralExpCS EOF ;
    public final void entryRuleLambdaLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1617:1: ( ruleLambdaLiteralExpCS EOF )
            // InternalOCLinEcore.g:1618: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:1625:1: ruleLambdaLiteralExpCS : ( ( rule__LambdaLiteralExpCS__Group__0 ) ) ;
    public final void ruleLambdaLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1629:2: ( ( ( rule__LambdaLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1630:1: ( ( rule__LambdaLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1630:1: ( ( rule__LambdaLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1631:1: ( rule__LambdaLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1632:1: ( rule__LambdaLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1632: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:1644:1: entryRuleMapLiteralExpCS : ruleMapLiteralExpCS EOF ;
    public final void entryRuleMapLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1645:1: ( ruleMapLiteralExpCS EOF )
            // InternalOCLinEcore.g:1646: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:1653:1: ruleMapLiteralExpCS : ( ( rule__MapLiteralExpCS__Group__0 ) ) ;
    public final void ruleMapLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1657:2: ( ( ( rule__MapLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1658:1: ( ( rule__MapLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1658:1: ( ( rule__MapLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1659:1: ( rule__MapLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1660:1: ( rule__MapLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1660: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:1672:1: entryRuleMapLiteralPartCS : ruleMapLiteralPartCS EOF ;
    public final void entryRuleMapLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1673:1: ( ruleMapLiteralPartCS EOF )
            // InternalOCLinEcore.g:1674: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:1681:1: ruleMapLiteralPartCS : ( ( rule__MapLiteralPartCS__Group__0 ) ) ;
    public final void ruleMapLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1685:2: ( ( ( rule__MapLiteralPartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1686:1: ( ( rule__MapLiteralPartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1686:1: ( ( rule__MapLiteralPartCS__Group__0 ) )
            // InternalOCLinEcore.g:1687:1: ( rule__MapLiteralPartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1688:1: ( rule__MapLiteralPartCS__Group__0 )
            // InternalOCLinEcore.g:1688: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:1700:1: entryRulePrimitiveLiteralExpCS : rulePrimitiveLiteralExpCS EOF ;
    public final void entryRulePrimitiveLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1701:1: ( rulePrimitiveLiteralExpCS EOF )
            // InternalOCLinEcore.g:1702: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:1709:1: rulePrimitiveLiteralExpCS : ( ( rule__PrimitiveLiteralExpCS__Alternatives ) ) ;
    public final void rulePrimitiveLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1713:2: ( ( ( rule__PrimitiveLiteralExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1714:1: ( ( rule__PrimitiveLiteralExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1714:1: ( ( rule__PrimitiveLiteralExpCS__Alternatives ) )
            // InternalOCLinEcore.g:1715:1: ( rule__PrimitiveLiteralExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimitiveLiteralExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1716:1: ( rule__PrimitiveLiteralExpCS__Alternatives )
            // InternalOCLinEcore.g:1716: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:1728:1: entryRuleTupleLiteralExpCS : ruleTupleLiteralExpCS EOF ;
    public final void entryRuleTupleLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1729:1: ( ruleTupleLiteralExpCS EOF )
            // InternalOCLinEcore.g:1730: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:1737:1: ruleTupleLiteralExpCS : ( ( rule__TupleLiteralExpCS__Group__0 ) ) ;
    public final void ruleTupleLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1741:2: ( ( ( rule__TupleLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1742:1: ( ( rule__TupleLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1742:1: ( ( rule__TupleLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1743:1: ( rule__TupleLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1744:1: ( rule__TupleLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1744: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:1756:1: entryRuleTupleLiteralPartCS : ruleTupleLiteralPartCS EOF ;
    public final void entryRuleTupleLiteralPartCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1757:1: ( ruleTupleLiteralPartCS EOF )
            // InternalOCLinEcore.g:1758: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:1765:1: ruleTupleLiteralPartCS : ( ( rule__TupleLiteralPartCS__Group__0 ) ) ;
    public final void ruleTupleLiteralPartCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1769:2: ( ( ( rule__TupleLiteralPartCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1770:1: ( ( rule__TupleLiteralPartCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1770:1: ( ( rule__TupleLiteralPartCS__Group__0 ) )
            // InternalOCLinEcore.g:1771:1: ( rule__TupleLiteralPartCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1772:1: ( rule__TupleLiteralPartCS__Group__0 )
            // InternalOCLinEcore.g:1772: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:1784:1: entryRuleNumberLiteralExpCS : ruleNumberLiteralExpCS EOF ;
    public final void entryRuleNumberLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1785:1: ( ruleNumberLiteralExpCS EOF )
            // InternalOCLinEcore.g:1786: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:1793:1: ruleNumberLiteralExpCS : ( ( rule__NumberLiteralExpCS__SymbolAssignment ) ) ;
    public final void ruleNumberLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1797:2: ( ( ( rule__NumberLiteralExpCS__SymbolAssignment ) ) )
            // InternalOCLinEcore.g:1798:1: ( ( rule__NumberLiteralExpCS__SymbolAssignment ) )
            {
            // InternalOCLinEcore.g:1798:1: ( ( rule__NumberLiteralExpCS__SymbolAssignment ) )
            // InternalOCLinEcore.g:1799:1: ( rule__NumberLiteralExpCS__SymbolAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolAssignment());
            }
            // InternalOCLinEcore.g:1800:1: ( rule__NumberLiteralExpCS__SymbolAssignment )
            // InternalOCLinEcore.g:1800: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:1812:1: entryRuleStringLiteralExpCS : ruleStringLiteralExpCS EOF ;
    public final void entryRuleStringLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1813:1: ( ruleStringLiteralExpCS EOF )
            // InternalOCLinEcore.g:1814: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:1821:1: ruleStringLiteralExpCS : ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) ) ;
    public final void ruleStringLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1825:2: ( ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) ) )
            // InternalOCLinEcore.g:1826:1: ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) )
            {
            // InternalOCLinEcore.g:1826:1: ( ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* ) )
            // InternalOCLinEcore.g:1827:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment ) ) ( ( rule__StringLiteralExpCS__SegmentsAssignment )* )
            {
            // InternalOCLinEcore.g:1827:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment ) )
            // InternalOCLinEcore.g:1828:1: ( rule__StringLiteralExpCS__SegmentsAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }
            // InternalOCLinEcore.g:1829:1: ( rule__StringLiteralExpCS__SegmentsAssignment )
            // InternalOCLinEcore.g:1829: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:1832:1: ( ( rule__StringLiteralExpCS__SegmentsAssignment )* )
            // InternalOCLinEcore.g:1833:1: ( rule__StringLiteralExpCS__SegmentsAssignment )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsAssignment());
            }
            // InternalOCLinEcore.g:1834: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:1834: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:1847:1: entryRuleBooleanLiteralExpCS : ruleBooleanLiteralExpCS EOF ;
    public final void entryRuleBooleanLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1848:1: ( ruleBooleanLiteralExpCS EOF )
            // InternalOCLinEcore.g:1849: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:1856:1: ruleBooleanLiteralExpCS : ( ( rule__BooleanLiteralExpCS__Alternatives ) ) ;
    public final void ruleBooleanLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1860:2: ( ( ( rule__BooleanLiteralExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1861:1: ( ( rule__BooleanLiteralExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1861:1: ( ( rule__BooleanLiteralExpCS__Alternatives ) )
            // InternalOCLinEcore.g:1862:1: ( rule__BooleanLiteralExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1863:1: ( rule__BooleanLiteralExpCS__Alternatives )
            // InternalOCLinEcore.g:1863: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:1875:1: entryRuleUnlimitedNaturalLiteralExpCS : ruleUnlimitedNaturalLiteralExpCS EOF ;
    public final void entryRuleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1876:1: ( ruleUnlimitedNaturalLiteralExpCS EOF )
            // InternalOCLinEcore.g:1877: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:1884:1: ruleUnlimitedNaturalLiteralExpCS : ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) ) ;
    public final void ruleUnlimitedNaturalLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1888:2: ( ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1889:1: ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1889:1: ( ( rule__UnlimitedNaturalLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1890:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1891:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1891: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:1903:1: entryRuleInvalidLiteralExpCS : ruleInvalidLiteralExpCS EOF ;
    public final void entryRuleInvalidLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1904:1: ( ruleInvalidLiteralExpCS EOF )
            // InternalOCLinEcore.g:1905: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:1912:1: ruleInvalidLiteralExpCS : ( ( rule__InvalidLiteralExpCS__Group__0 ) ) ;
    public final void ruleInvalidLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1916:2: ( ( ( rule__InvalidLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1917:1: ( ( rule__InvalidLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1917:1: ( ( rule__InvalidLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1918:1: ( rule__InvalidLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1919:1: ( rule__InvalidLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1919: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:1931:1: entryRuleNullLiteralExpCS : ruleNullLiteralExpCS EOF ;
    public final void entryRuleNullLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1932:1: ( ruleNullLiteralExpCS EOF )
            // InternalOCLinEcore.g:1933: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:1940:1: ruleNullLiteralExpCS : ( ( rule__NullLiteralExpCS__Group__0 ) ) ;
    public final void ruleNullLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1944:2: ( ( ( rule__NullLiteralExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:1945:1: ( ( rule__NullLiteralExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:1945:1: ( ( rule__NullLiteralExpCS__Group__0 ) )
            // InternalOCLinEcore.g:1946:1: ( rule__NullLiteralExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:1947:1: ( rule__NullLiteralExpCS__Group__0 )
            // InternalOCLinEcore.g:1947: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:1959:1: entryRuleTypeLiteralCS : ruleTypeLiteralCS EOF ;
    public final void entryRuleTypeLiteralCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1960:1: ( ruleTypeLiteralCS EOF )
            // InternalOCLinEcore.g:1961: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:1968:1: ruleTypeLiteralCS : ( ( rule__TypeLiteralCS__Alternatives ) ) ;
    public final void ruleTypeLiteralCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:1972:2: ( ( ( rule__TypeLiteralCS__Alternatives ) ) )
            // InternalOCLinEcore.g:1973:1: ( ( rule__TypeLiteralCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:1973:1: ( ( rule__TypeLiteralCS__Alternatives ) )
            // InternalOCLinEcore.g:1974:1: ( rule__TypeLiteralCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:1975:1: ( rule__TypeLiteralCS__Alternatives )
            // InternalOCLinEcore.g:1975: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:1987:1: entryRuleTypeLiteralWithMultiplicityCS : ruleTypeLiteralWithMultiplicityCS EOF ;
    public final void entryRuleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:1988:1: ( ruleTypeLiteralWithMultiplicityCS EOF )
            // InternalOCLinEcore.g:1989: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:1996:1: ruleTypeLiteralWithMultiplicityCS : ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) ) ;
    public final void ruleTypeLiteralWithMultiplicityCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2000:2: ( ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2001:1: ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2001:1: ( ( rule__TypeLiteralWithMultiplicityCS__Group__0 ) )
            // InternalOCLinEcore.g:2002:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2003:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0 )
            // InternalOCLinEcore.g:2003: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:2015:1: entryRuleTypeLiteralExpCS : ruleTypeLiteralExpCS EOF ;
    public final void entryRuleTypeLiteralExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2016:1: ( ruleTypeLiteralExpCS EOF )
            // InternalOCLinEcore.g:2017: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:2024:1: ruleTypeLiteralExpCS : ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) ) ;
    public final void ruleTypeLiteralExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2028:2: ( ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) ) )
            // InternalOCLinEcore.g:2029:1: ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) )
            {
            // InternalOCLinEcore.g:2029:1: ( ( rule__TypeLiteralExpCS__OwnedTypeAssignment ) )
            // InternalOCLinEcore.g:2030:1: ( rule__TypeLiteralExpCS__OwnedTypeAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeAssignment());
            }
            // InternalOCLinEcore.g:2031:1: ( rule__TypeLiteralExpCS__OwnedTypeAssignment )
            // InternalOCLinEcore.g:2031: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:2043:1: entryRuleTypeNameExpCS : ruleTypeNameExpCS EOF ;
    public final void entryRuleTypeNameExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2044:1: ( ruleTypeNameExpCS EOF )
            // InternalOCLinEcore.g:2045: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:2052:1: ruleTypeNameExpCS : ( ( rule__TypeNameExpCS__Group__0 ) ) ;
    public final void ruleTypeNameExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2056:2: ( ( ( rule__TypeNameExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2057:1: ( ( rule__TypeNameExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2057:1: ( ( rule__TypeNameExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2058:1: ( rule__TypeNameExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2059:1: ( rule__TypeNameExpCS__Group__0 )
            // InternalOCLinEcore.g:2059: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 "entryRuleTypeExpCS"
    // InternalOCLinEcore.g:2071:1: entryRuleTypeExpCS : ruleTypeExpCS EOF ;
    public final void entryRuleTypeExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2072:1: ( ruleTypeExpCS EOF )
            // InternalOCLinEcore.g:2073: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:2080:1: ruleTypeExpCS : ( ( rule__TypeExpCS__Group__0 ) ) ;
    public final void ruleTypeExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2084:2: ( ( ( rule__TypeExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2085:1: ( ( rule__TypeExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2085:1: ( ( rule__TypeExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2086:1: ( rule__TypeExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2087:1: ( rule__TypeExpCS__Group__0 )
            // InternalOCLinEcore.g:2087: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:2099:1: entryRuleExpCS : ruleExpCS EOF ;
    public final void entryRuleExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2100:1: ( ruleExpCS EOF )
            // InternalOCLinEcore.g:2101: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:2108:1: ruleExpCS : ( ( rule__ExpCS__Alternatives ) ) ;
    public final void ruleExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2112:2: ( ( ( rule__ExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2113:1: ( ( rule__ExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2113:1: ( ( rule__ExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2114:1: ( rule__ExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2115:1: ( rule__ExpCS__Alternatives )
            // InternalOCLinEcore.g:2115: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:2127:1: entryRulePrefixedLetExpCS : rulePrefixedLetExpCS EOF ;
    public final void entryRulePrefixedLetExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2128:1: ( rulePrefixedLetExpCS EOF )
            // InternalOCLinEcore.g:2129: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:2136:1: rulePrefixedLetExpCS : ( ( rule__PrefixedLetExpCS__Alternatives ) ) ;
    public final void rulePrefixedLetExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2140:2: ( ( ( rule__PrefixedLetExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2141:1: ( ( rule__PrefixedLetExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2141:1: ( ( rule__PrefixedLetExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2142:1: ( rule__PrefixedLetExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2143:1: ( rule__PrefixedLetExpCS__Alternatives )
            // InternalOCLinEcore.g:2143: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:2155:1: entryRulePrefixedPrimaryExpCS : rulePrefixedPrimaryExpCS EOF ;
    public final void entryRulePrefixedPrimaryExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2156:1: ( rulePrefixedPrimaryExpCS EOF )
            // InternalOCLinEcore.g:2157: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:2164:1: rulePrefixedPrimaryExpCS : ( ( rule__PrefixedPrimaryExpCS__Alternatives ) ) ;
    public final void rulePrefixedPrimaryExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2168:2: ( ( ( rule__PrefixedPrimaryExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2169:1: ( ( rule__PrefixedPrimaryExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2169:1: ( ( rule__PrefixedPrimaryExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2170:1: ( rule__PrefixedPrimaryExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2171:1: ( rule__PrefixedPrimaryExpCS__Alternatives )
            // InternalOCLinEcore.g:2171: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:2183:1: entryRulePrimaryExpCS : rulePrimaryExpCS EOF ;
    public final void entryRulePrimaryExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2184:1: ( rulePrimaryExpCS EOF )
            // InternalOCLinEcore.g:2185: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:2192:1: rulePrimaryExpCS : ( ( rule__PrimaryExpCS__Alternatives ) ) ;
    public final void rulePrimaryExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2196:2: ( ( ( rule__PrimaryExpCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2197:1: ( ( rule__PrimaryExpCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2197:1: ( ( rule__PrimaryExpCS__Alternatives ) )
            // InternalOCLinEcore.g:2198:1: ( rule__PrimaryExpCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrimaryExpCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2199:1: ( rule__PrimaryExpCS__Alternatives )
            // InternalOCLinEcore.g:2199: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:2211:1: entryRuleNameExpCS : ruleNameExpCS EOF ;
    public final void entryRuleNameExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2212:1: ( ruleNameExpCS EOF )
            // InternalOCLinEcore.g:2213: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:2220:1: ruleNameExpCS : ( ( rule__NameExpCS__Group__0 ) ) ;
    public final void ruleNameExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2224:2: ( ( ( rule__NameExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2225:1: ( ( rule__NameExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2225:1: ( ( rule__NameExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2226:1: ( rule__NameExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2227:1: ( rule__NameExpCS__Group__0 )
            // InternalOCLinEcore.g:2227: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:2239:1: entryRuleCurlyBracketedClauseCS : ruleCurlyBracketedClauseCS EOF ;
    public final void entryRuleCurlyBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2240:1: ( ruleCurlyBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2241: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:2248:1: ruleCurlyBracketedClauseCS : ( ( rule__CurlyBracketedClauseCS__Group__0 ) ) ;
    public final void ruleCurlyBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2252:2: ( ( ( rule__CurlyBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2253:1: ( ( rule__CurlyBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2253:1: ( ( rule__CurlyBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2254:1: ( rule__CurlyBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2255:1: ( rule__CurlyBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2255: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:2267:1: entryRuleRoundBracketedClauseCS : ruleRoundBracketedClauseCS EOF ;
    public final void entryRuleRoundBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2268:1: ( ruleRoundBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2269: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:2276:1: ruleRoundBracketedClauseCS : ( ( rule__RoundBracketedClauseCS__Group__0 ) ) ;
    public final void ruleRoundBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2280:2: ( ( ( rule__RoundBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2281:1: ( ( rule__RoundBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2281:1: ( ( rule__RoundBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2282:1: ( rule__RoundBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2283:1: ( rule__RoundBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2283: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:2295:1: entryRuleSquareBracketedClauseCS : ruleSquareBracketedClauseCS EOF ;
    public final void entryRuleSquareBracketedClauseCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2296:1: ( ruleSquareBracketedClauseCS EOF )
            // InternalOCLinEcore.g:2297: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:2304:1: ruleSquareBracketedClauseCS : ( ( rule__SquareBracketedClauseCS__Group__0 ) ) ;
    public final void ruleSquareBracketedClauseCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2308:2: ( ( ( rule__SquareBracketedClauseCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2309:1: ( ( rule__SquareBracketedClauseCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2309:1: ( ( rule__SquareBracketedClauseCS__Group__0 ) )
            // InternalOCLinEcore.g:2310:1: ( rule__SquareBracketedClauseCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2311:1: ( rule__SquareBracketedClauseCS__Group__0 )
            // InternalOCLinEcore.g:2311: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:2323:1: entryRuleNavigatingArgCS : ruleNavigatingArgCS EOF ;
    public final void entryRuleNavigatingArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2324:1: ( ruleNavigatingArgCS EOF )
            // InternalOCLinEcore.g:2325: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:2332:1: ruleNavigatingArgCS : ( ( rule__NavigatingArgCS__Alternatives ) ) ;
    public final void ruleNavigatingArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2336:2: ( ( ( rule__NavigatingArgCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2337:1: ( ( rule__NavigatingArgCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2337:1: ( ( rule__NavigatingArgCS__Alternatives ) )
            // InternalOCLinEcore.g:2338:1: ( rule__NavigatingArgCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2339:1: ( rule__NavigatingArgCS__Alternatives )
            // InternalOCLinEcore.g:2339: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:2351:1: entryRuleNavigatingBarArgCS : ruleNavigatingBarArgCS EOF ;
    public final void entryRuleNavigatingBarArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2352:1: ( ruleNavigatingBarArgCS EOF )
            // InternalOCLinEcore.g:2353: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:2360:1: ruleNavigatingBarArgCS : ( ( rule__NavigatingBarArgCS__Group__0 ) ) ;
    public final void ruleNavigatingBarArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2364:2: ( ( ( rule__NavigatingBarArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2365:1: ( ( rule__NavigatingBarArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2365:1: ( ( rule__NavigatingBarArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2366:1: ( rule__NavigatingBarArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2367:1: ( rule__NavigatingBarArgCS__Group__0 )
            // InternalOCLinEcore.g:2367: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:2379:1: entryRuleNavigatingCommaArgCS : ruleNavigatingCommaArgCS EOF ;
    public final void entryRuleNavigatingCommaArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2380:1: ( ruleNavigatingCommaArgCS EOF )
            // InternalOCLinEcore.g:2381: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:2388:1: ruleNavigatingCommaArgCS : ( ( rule__NavigatingCommaArgCS__Group__0 ) ) ;
    public final void ruleNavigatingCommaArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2392:2: ( ( ( rule__NavigatingCommaArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2393:1: ( ( rule__NavigatingCommaArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2393:1: ( ( rule__NavigatingCommaArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2394:1: ( rule__NavigatingCommaArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2395:1: ( rule__NavigatingCommaArgCS__Group__0 )
            // InternalOCLinEcore.g:2395: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:2407:1: entryRuleNavigatingSemiArgCS : ruleNavigatingSemiArgCS EOF ;
    public final void entryRuleNavigatingSemiArgCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2408:1: ( ruleNavigatingSemiArgCS EOF )
            // InternalOCLinEcore.g:2409: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:2416:1: ruleNavigatingSemiArgCS : ( ( rule__NavigatingSemiArgCS__Group__0 ) ) ;
    public final void ruleNavigatingSemiArgCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2420:2: ( ( ( rule__NavigatingSemiArgCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2421:1: ( ( rule__NavigatingSemiArgCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2421:1: ( ( rule__NavigatingSemiArgCS__Group__0 ) )
            // InternalOCLinEcore.g:2422:1: ( rule__NavigatingSemiArgCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2423:1: ( rule__NavigatingSemiArgCS__Group__0 )
            // InternalOCLinEcore.g:2423: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:2435:1: entryRuleNavigatingArgExpCS : ruleNavigatingArgExpCS EOF ;
    public final void entryRuleNavigatingArgExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2436:1: ( ruleNavigatingArgExpCS EOF )
            // InternalOCLinEcore.g:2437: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:2444:1: ruleNavigatingArgExpCS : ( ruleExpCS ) ;
    public final void ruleNavigatingArgExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2448:2: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:2449:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:2449:1: ( ruleExpCS )
            // InternalOCLinEcore.g:2450: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 "entryRuleIfExpCS"
    // InternalOCLinEcore.g:2463:1: entryRuleIfExpCS : ruleIfExpCS EOF ;
    public final void entryRuleIfExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2464:1: ( ruleIfExpCS EOF )
            // InternalOCLinEcore.g:2465: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:2472:1: ruleIfExpCS : ( ( rule__IfExpCS__Group__0 ) ) ;
    public final void ruleIfExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2476:2: ( ( ( rule__IfExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2477:1: ( ( rule__IfExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2477:1: ( ( rule__IfExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2478:1: ( rule__IfExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2479:1: ( rule__IfExpCS__Group__0 )
            // InternalOCLinEcore.g:2479: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:2491:1: entryRuleElseIfThenExpCS : ruleElseIfThenExpCS EOF ;
    public final void entryRuleElseIfThenExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2492:1: ( ruleElseIfThenExpCS EOF )
            // InternalOCLinEcore.g:2493: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:2500:1: ruleElseIfThenExpCS : ( ( rule__ElseIfThenExpCS__Group__0 ) ) ;
    public final void ruleElseIfThenExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2504:2: ( ( ( rule__ElseIfThenExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2505:1: ( ( rule__ElseIfThenExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2505:1: ( ( rule__ElseIfThenExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2506:1: ( rule__ElseIfThenExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2507:1: ( rule__ElseIfThenExpCS__Group__0 )
            // InternalOCLinEcore.g:2507: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:2519:1: entryRuleLetExpCS : ruleLetExpCS EOF ;
    public final void entryRuleLetExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2520:1: ( ruleLetExpCS EOF )
            // InternalOCLinEcore.g:2521: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:2528:1: ruleLetExpCS : ( ( rule__LetExpCS__Group__0 ) ) ;
    public final void ruleLetExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2532:2: ( ( ( rule__LetExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2533:1: ( ( rule__LetExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2533:1: ( ( rule__LetExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2534:1: ( rule__LetExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2535:1: ( rule__LetExpCS__Group__0 )
            // InternalOCLinEcore.g:2535: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:2547:1: entryRuleLetVariableCS : ruleLetVariableCS EOF ;
    public final void entryRuleLetVariableCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2548:1: ( ruleLetVariableCS EOF )
            // InternalOCLinEcore.g:2549: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:2556:1: ruleLetVariableCS : ( ( rule__LetVariableCS__Group__0 ) ) ;
    public final void ruleLetVariableCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2560:2: ( ( ( rule__LetVariableCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2561:1: ( ( rule__LetVariableCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2561:1: ( ( rule__LetVariableCS__Group__0 ) )
            // InternalOCLinEcore.g:2562:1: ( rule__LetVariableCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2563:1: ( rule__LetVariableCS__Group__0 )
            // InternalOCLinEcore.g:2563: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:2575:1: entryRuleNestedExpCS : ruleNestedExpCS EOF ;
    public final void entryRuleNestedExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2576:1: ( ruleNestedExpCS EOF )
            // InternalOCLinEcore.g:2577: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:2584:1: ruleNestedExpCS : ( ( rule__NestedExpCS__Group__0 ) ) ;
    public final void ruleNestedExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2588:2: ( ( ( rule__NestedExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2589:1: ( ( rule__NestedExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2589:1: ( ( rule__NestedExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2590:1: ( rule__NestedExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2591:1: ( rule__NestedExpCS__Group__0 )
            // InternalOCLinEcore.g:2591: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:2603:1: entryRuleSelfExpCS : ruleSelfExpCS EOF ;
    public final void entryRuleSelfExpCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2604:1: ( ruleSelfExpCS EOF )
            // InternalOCLinEcore.g:2605: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:2612:1: ruleSelfExpCS : ( ( rule__SelfExpCS__Group__0 ) ) ;
    public final void ruleSelfExpCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2616:2: ( ( ( rule__SelfExpCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2617:1: ( ( rule__SelfExpCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2617:1: ( ( rule__SelfExpCS__Group__0 ) )
            // InternalOCLinEcore.g:2618:1: ( rule__SelfExpCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2619:1: ( rule__SelfExpCS__Group__0 )
            // InternalOCLinEcore.g:2619: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:2631:1: entryRuleMultiplicityBoundsCS : ruleMultiplicityBoundsCS EOF ;
    public final void entryRuleMultiplicityBoundsCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2632:1: ( ruleMultiplicityBoundsCS EOF )
            // InternalOCLinEcore.g:2633: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:2640:1: ruleMultiplicityBoundsCS : ( ( rule__MultiplicityBoundsCS__Group__0 ) ) ;
    public final void ruleMultiplicityBoundsCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2644:2: ( ( ( rule__MultiplicityBoundsCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2645:1: ( ( rule__MultiplicityBoundsCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2645:1: ( ( rule__MultiplicityBoundsCS__Group__0 ) )
            // InternalOCLinEcore.g:2646:1: ( rule__MultiplicityBoundsCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2647:1: ( rule__MultiplicityBoundsCS__Group__0 )
            // InternalOCLinEcore.g:2647: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:2659:1: entryRuleMultiplicityCS : ruleMultiplicityCS EOF ;
    public final void entryRuleMultiplicityCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2660:1: ( ruleMultiplicityCS EOF )
            // InternalOCLinEcore.g:2661: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:2668:1: ruleMultiplicityCS : ( ( rule__MultiplicityCS__Group__0 ) ) ;
    public final void ruleMultiplicityCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2672:2: ( ( ( rule__MultiplicityCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2673:1: ( ( rule__MultiplicityCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2673:1: ( ( rule__MultiplicityCS__Group__0 ) )
            // InternalOCLinEcore.g:2674:1: ( rule__MultiplicityCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2675:1: ( rule__MultiplicityCS__Group__0 )
            // InternalOCLinEcore.g:2675: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:2687:1: entryRuleMultiplicityStringCS : ruleMultiplicityStringCS EOF ;
    public final void entryRuleMultiplicityStringCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2688:1: ( ruleMultiplicityStringCS EOF )
            // InternalOCLinEcore.g:2689: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:2696:1: ruleMultiplicityStringCS : ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) ) ;
    public final void ruleMultiplicityStringCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2700:2: ( ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) ) )
            // InternalOCLinEcore.g:2701:1: ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) )
            {
            // InternalOCLinEcore.g:2701:1: ( ( rule__MultiplicityStringCS__StringBoundsAssignment ) )
            // InternalOCLinEcore.g:2702:1: ( rule__MultiplicityStringCS__StringBoundsAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment());
            }
            // InternalOCLinEcore.g:2703:1: ( rule__MultiplicityStringCS__StringBoundsAssignment )
            // InternalOCLinEcore.g:2703: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:2715:1: entryRulePathNameCS : rulePathNameCS EOF ;
    public final void entryRulePathNameCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2716:1: ( rulePathNameCS EOF )
            // InternalOCLinEcore.g:2717: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:2724:1: rulePathNameCS : ( ( rule__PathNameCS__Group__0 ) ) ;
    public final void rulePathNameCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2728:2: ( ( ( rule__PathNameCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2729:1: ( ( rule__PathNameCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2729:1: ( ( rule__PathNameCS__Group__0 ) )
            // InternalOCLinEcore.g:2730:1: ( rule__PathNameCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2731:1: ( rule__PathNameCS__Group__0 )
            // InternalOCLinEcore.g:2731: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:2743:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
    public final void entryRuleFirstPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2744:1: ( ruleFirstPathElementCS EOF )
            // InternalOCLinEcore.g:2745: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:2752:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
    public final void ruleFirstPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2756:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
            // InternalOCLinEcore.g:2757:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
            {
            // InternalOCLinEcore.g:2757:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
            // InternalOCLinEcore.g:2758:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
            }
            // InternalOCLinEcore.g:2759:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
            // InternalOCLinEcore.g:2759: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:2771:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
    public final void entryRuleNextPathElementCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2772:1: ( ruleNextPathElementCS EOF )
            // InternalOCLinEcore.g:2773: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:2780:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
    public final void ruleNextPathElementCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2784:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
            // InternalOCLinEcore.g:2785:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
            {
            // InternalOCLinEcore.g:2785:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
            // InternalOCLinEcore.g:2786:1: ( rule__NextPathElementCS__ReferredElementAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
            }
            // InternalOCLinEcore.g:2787:1: ( rule__NextPathElementCS__ReferredElementAssignment )
            // InternalOCLinEcore.g:2787: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:2799:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
    public final void entryRuleTemplateBindingCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2800:1: ( ruleTemplateBindingCS EOF )
            // InternalOCLinEcore.g:2801: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:2808:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
    public final void ruleTemplateBindingCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2812:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2813:1: ( ( rule__TemplateBindingCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2813:1: ( ( rule__TemplateBindingCS__Group__0 ) )
            // InternalOCLinEcore.g:2814:1: ( rule__TemplateBindingCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2815:1: ( rule__TemplateBindingCS__Group__0 )
            // InternalOCLinEcore.g:2815: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:2827:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
    public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2828:1: ( ruleTemplateParameterSubstitutionCS EOF )
            // InternalOCLinEcore.g:2829: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:2836:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
    public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2840:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
            // InternalOCLinEcore.g:2841:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
            {
            // InternalOCLinEcore.g:2841:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
            // InternalOCLinEcore.g:2842:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
            }
            // InternalOCLinEcore.g:2843:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
            // InternalOCLinEcore.g:2843: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:2855:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
    public final void entryRuleTypeParameterCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2856:1: ( ruleTypeParameterCS EOF )
            // InternalOCLinEcore.g:2857: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:2864:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
    public final void ruleTypeParameterCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2868:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2869:1: ( ( rule__TypeParameterCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2869:1: ( ( rule__TypeParameterCS__Group__0 ) )
            // InternalOCLinEcore.g:2870:1: ( rule__TypeParameterCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2871:1: ( rule__TypeParameterCS__Group__0 )
            // InternalOCLinEcore.g:2871: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:2883:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
    public final void entryRuleTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2884:1: ( ruleTypeRefCS EOF )
            // InternalOCLinEcore.g:2885: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:2892:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
    public final void ruleTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2896:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
            // InternalOCLinEcore.g:2897:1: ( ( rule__TypeRefCS__Alternatives ) )
            {
            // InternalOCLinEcore.g:2897:1: ( ( rule__TypeRefCS__Alternatives ) )
            // InternalOCLinEcore.g:2898:1: ( rule__TypeRefCS__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeRefCSAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2899:1: ( rule__TypeRefCS__Alternatives )
            // InternalOCLinEcore.g:2899: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:2911:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
    public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2912:1: ( ruleWildcardTypeRefCS EOF )
            // InternalOCLinEcore.g:2913: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:2920:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
    public final void ruleWildcardTypeRefCS() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2924:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
            // InternalOCLinEcore.g:2925:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
            {
            // InternalOCLinEcore.g:2925:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
            // InternalOCLinEcore.g:2926:1: ( rule__WildcardTypeRefCS__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
            }
            // InternalOCLinEcore.g:2927:1: ( rule__WildcardTypeRefCS__Group__0 )
            // InternalOCLinEcore.g:2927: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:2939:1: entryRuleID : ruleID EOF ;
    public final void entryRuleID() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2940:1: ( ruleID EOF )
            // InternalOCLinEcore.g:2941: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:2948:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
    public final void ruleID() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2952:2: ( ( ( rule__ID__Alternatives ) ) )
            // InternalOCLinEcore.g:2953:1: ( ( rule__ID__Alternatives ) )
            {
            // InternalOCLinEcore.g:2953:1: ( ( rule__ID__Alternatives ) )
            // InternalOCLinEcore.g:2954:1: ( rule__ID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIDAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:2955:1: ( rule__ID__Alternatives )
            // InternalOCLinEcore.g:2955: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:2967:1: entryRuleIdentifier : ruleIdentifier EOF ;
    public final void entryRuleIdentifier() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2968:1: ( ruleIdentifier EOF )
            // InternalOCLinEcore.g:2969: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:2976:1: ruleIdentifier : ( ruleID ) ;
    public final void ruleIdentifier() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:2980:2: ( ( ruleID ) )
            // InternalOCLinEcore.g:2981:1: ( ruleID )
            {
            // InternalOCLinEcore.g:2981:1: ( ruleID )
            // InternalOCLinEcore.g:2982: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:2995:1: entryRuleLOWER : ruleLOWER EOF ;
    public final void entryRuleLOWER() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:2996:1: ( ruleLOWER EOF )
            // InternalOCLinEcore.g:2997: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:3004:1: ruleLOWER : ( RULE_INT ) ;
    public final void ruleLOWER() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3008:2: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:3009:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:3009:1: ( RULE_INT )
            // InternalOCLinEcore.g:3010: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:3023:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
    public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3024:1: ( ruleNUMBER_LITERAL EOF )
            // InternalOCLinEcore.g:3025: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:3032:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
    public final void ruleNUMBER_LITERAL() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3036:2: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:3037:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:3037:1: ( RULE_INT )
            // InternalOCLinEcore.g:3038: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:3051:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
    public final void entryRuleStringLiteral() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3052:1: ( ruleStringLiteral EOF )
            // InternalOCLinEcore.g:3053: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:3060:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void ruleStringLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3064:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:3065:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:3065:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:3066: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:3079:1: entryRuleUPPER : ruleUPPER EOF ;
    public final void entryRuleUPPER() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3080:1: ( ruleUPPER EOF )
            // InternalOCLinEcore.g:3081: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:3088:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
    public final void ruleUPPER() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3092:2: ( ( ( rule__UPPER__Alternatives ) ) )
            // InternalOCLinEcore.g:3093:1: ( ( rule__UPPER__Alternatives ) )
            {
            // InternalOCLinEcore.g:3093:1: ( ( rule__UPPER__Alternatives ) )
            // InternalOCLinEcore.g:3094:1: ( rule__UPPER__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUPPERAccess().getAlternatives());
            }
            // InternalOCLinEcore.g:3095:1: ( rule__UPPER__Alternatives )
            // InternalOCLinEcore.g:3095: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:3107:1: entryRuleURI : ruleURI EOF ;
    public final void entryRuleURI() throws RecognitionException {
        try {
            // InternalOCLinEcore.g:3108:1: ( ruleURI EOF )
            // InternalOCLinEcore.g:3109: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:3116:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void ruleURI() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3120:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:3121:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:3121:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:3122: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:3135: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:3139: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:3140:1: ( ruleEssentialOCLUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3140:1: ( ruleEssentialOCLUnrestrictedName )
                    // InternalOCLinEcore.g:3141: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:3146:6: ( 'abstract' )
                    {
                    // InternalOCLinEcore.g:3146:6: ( 'abstract' )
                    // InternalOCLinEcore.g:3147: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:3154:6: ( 'attribute' )
                    {
                    // InternalOCLinEcore.g:3154:6: ( 'attribute' )
                    // InternalOCLinEcore.g:3155: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:3162:6: ( 'body' )
                    {
                    // InternalOCLinEcore.g:3162:6: ( 'body' )
                    // InternalOCLinEcore.g:3163: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:3170:6: ( 'callable' )
                    {
                    // InternalOCLinEcore.g:3170:6: ( 'callable' )
                    // InternalOCLinEcore.g:3171: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:3178:6: ( 'class' )
                    {
                    // InternalOCLinEcore.g:3178:6: ( 'class' )
                    // InternalOCLinEcore.g:3179: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:3186:6: ( 'composes' )
                    {
                    // InternalOCLinEcore.g:3186:6: ( 'composes' )
                    // InternalOCLinEcore.g:3187: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:3194:6: ( 'datatype' )
                    {
                    // InternalOCLinEcore.g:3194:6: ( 'datatype' )
                    // InternalOCLinEcore.g:3195: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:3202:6: ( 'definition' )
                    {
                    // InternalOCLinEcore.g:3202:6: ( 'definition' )
                    // InternalOCLinEcore.g:3203: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:3210:6: ( 'derivation' )
                    {
                    // InternalOCLinEcore.g:3210:6: ( 'derivation' )
                    // InternalOCLinEcore.g:3211: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:3218:6: ( 'derived' )
                    {
                    // InternalOCLinEcore.g:3218:6: ( 'derived' )
                    // InternalOCLinEcore.g:3219: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:3226:6: ( 'enum' )
                    {
                    // InternalOCLinEcore.g:3226:6: ( 'enum' )
                    // InternalOCLinEcore.g:3227: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:3234:6: ( 'extends' )
                    {
                    // InternalOCLinEcore.g:3234:6: ( 'extends' )
                    // InternalOCLinEcore.g:3235: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:3242:6: ( 'id' )
                    {
                    // InternalOCLinEcore.g:3242:6: ( 'id' )
                    // InternalOCLinEcore.g:3243: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:3250:6: ( 'import' )
                    {
                    // InternalOCLinEcore.g:3250:6: ( 'import' )
                    // InternalOCLinEcore.g:3251: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:3258:6: ( 'initial' )
                    {
                    // InternalOCLinEcore.g:3258:6: ( 'initial' )
                    // InternalOCLinEcore.g:3259: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:3266:6: ( 'interface' )
                    {
                    // InternalOCLinEcore.g:3266:6: ( 'interface' )
                    // InternalOCLinEcore.g:3267: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:3274:6: ( 'key' )
                    {
                    // InternalOCLinEcore.g:3274:6: ( 'key' )
                    // InternalOCLinEcore.g:3275: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:3282:6: ( 'library' )
                    {
                    // InternalOCLinEcore.g:3282:6: ( 'library' )
                    // InternalOCLinEcore.g:3283: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:3290:6: ( 'module' )
                    {
                    // InternalOCLinEcore.g:3290:6: ( 'module' )
                    // InternalOCLinEcore.g:3291: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:3298:6: ( 'operation' )
                    {
                    // InternalOCLinEcore.g:3298:6: ( 'operation' )
                    // InternalOCLinEcore.g:3299: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:3306:6: ( 'ordered' )
                    {
                    // InternalOCLinEcore.g:3306:6: ( 'ordered' )
                    // InternalOCLinEcore.g:3307: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:3314:6: ( 'package' )
                    {
                    // InternalOCLinEcore.g:3314:6: ( 'package' )
                    // InternalOCLinEcore.g:3315: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:3322:6: ( 'postcondition' )
                    {
                    // InternalOCLinEcore.g:3322:6: ( 'postcondition' )
                    // InternalOCLinEcore.g:3323: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:3330:6: ( 'precondition' )
                    {
                    // InternalOCLinEcore.g:3330:6: ( 'precondition' )
                    // InternalOCLinEcore.g:3331: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:3338:6: ( 'primitive' )
                    {
                    // InternalOCLinEcore.g:3338:6: ( 'primitive' )
                    // InternalOCLinEcore.g:3339: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:3346:6: ( 'property' )
                    {
                    // InternalOCLinEcore.g:3346:6: ( 'property' )
                    // InternalOCLinEcore.g:3347: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:3354:6: ( 'readonly' )
                    {
                    // InternalOCLinEcore.g:3354:6: ( 'readonly' )
                    // InternalOCLinEcore.g:3355: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:3362:6: ( 'reference' )
                    {
                    // InternalOCLinEcore.g:3362:6: ( 'reference' )
                    // InternalOCLinEcore.g:3363: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:3370:6: ( 'resolve' )
                    {
                    // InternalOCLinEcore.g:3370:6: ( 'resolve' )
                    // InternalOCLinEcore.g:3371: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:3378:6: ( 'static' )
                    {
                    // InternalOCLinEcore.g:3378:6: ( 'static' )
                    // InternalOCLinEcore.g:3379: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:3386:6: ( 'throws' )
                    {
                    // InternalOCLinEcore.g:3386:6: ( 'throws' )
                    // InternalOCLinEcore.g:3387: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:3394:6: ( 'transient' )
                    {
                    // InternalOCLinEcore.g:3394:6: ( 'transient' )
                    // InternalOCLinEcore.g:3395: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:3402:6: ( 'unique' )
                    {
                    // InternalOCLinEcore.g:3402:6: ( 'unique' )
                    // InternalOCLinEcore.g:3403: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:3410:6: ( 'unsettable' )
                    {
                    // InternalOCLinEcore.g:3410:6: ( 'unsettable' )
                    // InternalOCLinEcore.g:3411: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:3418:6: ( 'volatile' )
                    {
                    // InternalOCLinEcore.g:3418:6: ( 'volatile' )
                    // InternalOCLinEcore.g:3419: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:3431: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:3435:1: ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) )
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==98) ) {
                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:3436:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3436:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
                    // InternalOCLinEcore.g:3437:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getInvariantConstraintCSAccess().getGroup_3_0());
                    }
                    // InternalOCLinEcore.g:3438:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
                    // InternalOCLinEcore.g:3438: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:3442:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3442:6: ( ';' )
                    // InternalOCLinEcore.g:3443: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:3455: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:3459: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<=59)) ) {
                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:3460:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3460:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3461: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:3466:6: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3466:6: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3467: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:3477: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:3481:1: ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) )
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==100) ) {
                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:3482:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3482:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
                    // InternalOCLinEcore.g:3483:1: ( rule__AnnotationCS__Group_4_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getGroup_4_0());
                    }
                    // InternalOCLinEcore.g:3484:1: ( rule__AnnotationCS__Group_4_0__0 )
                    // InternalOCLinEcore.g:3484: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:3488:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3488:6: ( ';' )
                    // InternalOCLinEcore.g:3489: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:3501: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:3505: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 59:
                {
                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<=59)) ) {
                    alt6=3;
                }
                else if ( (LA6_3==52||LA6_3==69||LA6_3==100) ) {
                    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:3506:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3506:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    // InternalOCLinEcore.g:3507:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }
                    // InternalOCLinEcore.g:3508:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    // InternalOCLinEcore.g:3508: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:3512:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:3512:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
                    // InternalOCLinEcore.g:3513:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedContentsAssignment_4_0_1_1());
                    }
                    // InternalOCLinEcore.g:3514:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
                    // InternalOCLinEcore.g:3514: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:3518:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:3518:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
                    // InternalOCLinEcore.g:3519:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAnnotationCSAccess().getOwnedReferencesAssignment_4_0_1_2());
                    }
                    // InternalOCLinEcore.g:3520:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
                    // InternalOCLinEcore.g:3520: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:3529:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) );
    public final void rule__AnnotationElementCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3533:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) )
            int alt7=3;
            switch ( input.LA(1) ) {
            case 54:
                {
                alt7=1;
                }
                break;
            case 55:
                {
                alt7=2;
                }
                break;
            case 59:
                {
                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:3534:1: ( ruleAnnotationCS )
                    {
                    // InternalOCLinEcore.g:3534:1: ( ruleAnnotationCS )
                    // InternalOCLinEcore.g:3535: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:3540:6: ( ruleDocumentationCS )
                    {
                    // InternalOCLinEcore.g:3540:6: ( ruleDocumentationCS )
                    // InternalOCLinEcore.g:3541: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:3546:6: ( ruleSysMLCS )
                    {
                    // InternalOCLinEcore.g:3546:6: ( ruleSysMLCS )
                    // InternalOCLinEcore.g:3547: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:3557: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:3561: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:3562:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3562:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:3563:1: ( rule__AttributeCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:3564:1: ( rule__AttributeCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:3564: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:3568:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:3568:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:3569:1: ( rule__AttributeCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:3570:1: ( rule__AttributeCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:3570: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:3579: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:3583: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 122:
                {
                alt9=2;
                }
                break;
            case 29:
                {
                alt9=3;
                }
                break;
            case 123:
                {
                alt9=4;
                }
                break;
            case 37:
                {
                alt9=5;
                }
                break;
            case 124:
                {
                alt9=6;
                }
                break;
            case 43:
                {
                alt9=7;
                }
                break;
            case 125:
                {
                alt9=8;
                }
                break;
            case 48:
                {
                alt9=9;
                }
                break;
            case 126:
                {
                alt9=10;
                }
                break;
            case 49:
                {
                alt9=11;
                }
                break;
            case 127:
                {
                alt9=12;
                }
                break;
            case 50:
                {
                alt9=13;
                }
                break;
            case 128:
                {
                alt9=14;
                }
                break;
            case 51:
                {
                alt9=15;
                }
                break;
            case 129:
                {
                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:3584:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:3584:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
                    // InternalOCLinEcore.g:3585:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_0());
                    }
                    // InternalOCLinEcore.g:3586:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
                    // InternalOCLinEcore.g:3586: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:3590:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:3590:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
                    // InternalOCLinEcore.g:3591:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_1());
                    }
                    // InternalOCLinEcore.g:3592:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
                    // InternalOCLinEcore.g:3592: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:3596:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:3596:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
                    // InternalOCLinEcore.g:3597:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_2());
                    }
                    // InternalOCLinEcore.g:3598:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
                    // InternalOCLinEcore.g:3598: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:3602:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:3602:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
                    // InternalOCLinEcore.g:3603:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_3());
                    }
                    // InternalOCLinEcore.g:3604:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
                    // InternalOCLinEcore.g:3604: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:3608:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:3608:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
                    // InternalOCLinEcore.g:3609:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_4());
                    }
                    // InternalOCLinEcore.g:3610:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
                    // InternalOCLinEcore.g:3610: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:3614:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:3614:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
                    // InternalOCLinEcore.g:3615:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_5());
                    }
                    // InternalOCLinEcore.g:3616:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
                    // InternalOCLinEcore.g:3616: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:3620:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:3620:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
                    // InternalOCLinEcore.g:3621:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_6());
                    }
                    // InternalOCLinEcore.g:3622:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
                    // InternalOCLinEcore.g:3622: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:3626:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:3626:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
                    // InternalOCLinEcore.g:3627:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_7());
                    }
                    // InternalOCLinEcore.g:3628:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
                    // InternalOCLinEcore.g:3628: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:3632:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
                    {
                    // InternalOCLinEcore.g:3632:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
                    // InternalOCLinEcore.g:3633:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_8());
                    }
                    // InternalOCLinEcore.g:3634:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
                    // InternalOCLinEcore.g:3634: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:3638:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
                    {
                    // InternalOCLinEcore.g:3638:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
                    // InternalOCLinEcore.g:3639:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_9());
                    }
                    // InternalOCLinEcore.g:3640:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
                    // InternalOCLinEcore.g:3640: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:3644:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
                    {
                    // InternalOCLinEcore.g:3644:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
                    // InternalOCLinEcore.g:3645:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_10());
                    }
                    // InternalOCLinEcore.g:3646:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
                    // InternalOCLinEcore.g:3646: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:3650:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
                    {
                    // InternalOCLinEcore.g:3650:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
                    // InternalOCLinEcore.g:3651:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_11());
                    }
                    // InternalOCLinEcore.g:3652:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
                    // InternalOCLinEcore.g:3652: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:3656:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
                    {
                    // InternalOCLinEcore.g:3656:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
                    // InternalOCLinEcore.g:3657:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_12());
                    }
                    // InternalOCLinEcore.g:3658:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
                    // InternalOCLinEcore.g:3658: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:3662:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
                    {
                    // InternalOCLinEcore.g:3662:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
                    // InternalOCLinEcore.g:3663:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_13());
                    }
                    // InternalOCLinEcore.g:3664:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
                    // InternalOCLinEcore.g:3664: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:3668:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
                    {
                    // InternalOCLinEcore.g:3668:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
                    // InternalOCLinEcore.g:3669:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_14());
                    }
                    // InternalOCLinEcore.g:3670:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
                    // InternalOCLinEcore.g:3670: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:3674:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
                    {
                    // InternalOCLinEcore.g:3674:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
                    // InternalOCLinEcore.g:3675:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_15());
                    }
                    // InternalOCLinEcore.g:3676:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
                    // InternalOCLinEcore.g:3676: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:3685: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:3689:1: ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) )
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==100) ) {
                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:3690:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3690:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
                    // InternalOCLinEcore.g:3691:1: ( rule__AttributeCS__Group_6_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0());
                    }
                    // InternalOCLinEcore.g:3692:1: ( rule__AttributeCS__Group_6_0__0 )
                    // InternalOCLinEcore.g:3692: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:3696:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3696:6: ( ';' )
                    // InternalOCLinEcore.g:3697: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:3709: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:3713: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 59:
                {
                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:3714:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3714:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    // InternalOCLinEcore.g:3715:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }
                    // InternalOCLinEcore.g:3716:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    // InternalOCLinEcore.g:3716: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:3720:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:3720:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
                    // InternalOCLinEcore.g:3721:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_1());
                    }
                    // InternalOCLinEcore.g:3722:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
                    // InternalOCLinEcore.g:3722: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:3726:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:3726:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
                    // InternalOCLinEcore.g:3727:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_2());
                    }
                    // InternalOCLinEcore.g:3728:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
                    // InternalOCLinEcore.g:3728: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:3737:1: rule__ClassCS__Alternatives : ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) );
    public final void rule__ClassCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3741: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:3742:1: ( ruleStructuredClassCS )
                    {
                    // InternalOCLinEcore.g:3742:1: ( ruleStructuredClassCS )
                    // InternalOCLinEcore.g:3743: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:3748:6: ( ruleDataTypeCS )
                    {
                    // InternalOCLinEcore.g:3748:6: ( ruleDataTypeCS )
                    // InternalOCLinEcore.g:3749: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:3754:6: ( ruleEnumerationCS )
                    {
                    // InternalOCLinEcore.g:3754:6: ( ruleEnumerationCS )
                    // InternalOCLinEcore.g:3755: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:3765: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:3769:1: ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) )
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==58) ) {
                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:3770:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3770:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
                    // InternalOCLinEcore.g:3771:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getIsSerializableAssignment_5_1_0());
                    }
                    // InternalOCLinEcore.g:3772:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
                    // InternalOCLinEcore.g:3772: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:3776:6: ( '!serializable' )
                    {
                    // InternalOCLinEcore.g:3776:6: ( '!serializable' )
                    // InternalOCLinEcore.g:3777: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:3789: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:3793:1: ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) )
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==100) ) {
                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:3794:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3794:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
                    // InternalOCLinEcore.g:3795:1: ( rule__DataTypeCS__Group_6_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getGroup_6_0());
                    }
                    // InternalOCLinEcore.g:3796:1: ( rule__DataTypeCS__Group_6_0__0 )
                    // InternalOCLinEcore.g:3796: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:3800:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3800:6: ( ';' )
                    // InternalOCLinEcore.g:3801: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:3813: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:3817: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==59) ) {
                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:3818:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3818:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                    // InternalOCLinEcore.g:3819:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                    }
                    // InternalOCLinEcore.g:3820:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                    // InternalOCLinEcore.g:3820: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:3824:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:3824:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
                    // InternalOCLinEcore.g:3825:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsAssignment_6_0_1_1());
                    }
                    // InternalOCLinEcore.g:3826:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
                    // InternalOCLinEcore.g:3826: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:3835: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:3839: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<=59)) ) {
                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:3840:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:3840:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:3841: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:3846:6: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3846:6: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3847: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:3857: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:3861: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:3862:1: ( RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3862:1: ( RULE_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3863: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:3868:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                    {
                    // InternalOCLinEcore.g:3868:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                    // InternalOCLinEcore.g:3869: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:3879: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:3883:1: ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) )
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==58) ) {
                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:3884:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3884:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
                    // InternalOCLinEcore.g:3885:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getIsSerializableAssignment_4_1_0());
                    }
                    // InternalOCLinEcore.g:3886:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
                    // InternalOCLinEcore.g:3886: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:3890:6: ( '!serializable' )
                    {
                    // InternalOCLinEcore.g:3890:6: ( '!serializable' )
                    // InternalOCLinEcore.g:3891: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:3903: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:3907:1: ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) )
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==100) ) {
                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:3908:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3908:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
                    // InternalOCLinEcore.g:3909:1: ( rule__EnumerationCS__Group_5_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getGroup_5_0());
                    }
                    // InternalOCLinEcore.g:3910:1: ( rule__EnumerationCS__Group_5_0__0 )
                    // InternalOCLinEcore.g:3910: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:3914:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3914:6: ( ';' )
                    // InternalOCLinEcore.g:3915: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:3927: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:3931: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 59:
                {
                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==56) ) {
                    alt20=3;
                }
                else if ( (LA20_3==52||LA20_3==69||LA20_3==100) ) {
                    alt20=2;
                }
                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:3932:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:3932:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
                    // InternalOCLinEcore.g:3933:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAssignment_5_0_1_0());
                    }
                    // InternalOCLinEcore.g:3934:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
                    // InternalOCLinEcore.g:3934: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:3938:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:3938:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
                    // InternalOCLinEcore.g:3939:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsAssignment_5_0_1_1());
                    }
                    // InternalOCLinEcore.g:3940:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
                    // InternalOCLinEcore.g:3940: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:3944:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:3944:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
                    // InternalOCLinEcore.g:3945:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsAssignment_5_0_1_2());
                    }
                    // InternalOCLinEcore.g:3946:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
                    // InternalOCLinEcore.g:3946: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:3955: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:3959: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:3960:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3960:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:3961:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:3962:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:3962: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:3966:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
                    {
                    // InternalOCLinEcore.g:3966:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
                    // InternalOCLinEcore.g:3967:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_1());
                    }
                    // InternalOCLinEcore.g:3968:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
                    // InternalOCLinEcore.g:3968: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_2"
    // InternalOCLinEcore.g:3977:1: rule__EnumerationLiteralCS__Alternatives_2 : ( ( ( rule__EnumerationLiteralCS__Group_2_0__0 ) ) | ( ';' ) );
    public final void rule__EnumerationLiteralCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:3981:1: ( ( ( rule__EnumerationLiteralCS__Group_2_0__0 ) ) | ( ';' ) )
            int alt22=2;
            int LA22_0 = input.LA(1);

            if ( (LA22_0==100) ) {
                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:3982:1: ( ( rule__EnumerationLiteralCS__Group_2_0__0 ) )
                    {
                    // InternalOCLinEcore.g:3982:1: ( ( rule__EnumerationLiteralCS__Group_2_0__0 ) )
                    // InternalOCLinEcore.g:3983:1: ( rule__EnumerationLiteralCS__Group_2_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:3984:1: ( rule__EnumerationLiteralCS__Group_2_0__0 )
                    // InternalOCLinEcore.g:3984:2: rule__EnumerationLiteralCS__Group_2_0__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__EnumerationLiteralCS__Group_2_0__0();

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

                    }

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

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:3988:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:3988:6: ( ';' )
                    // InternalOCLinEcore.g:3989:1: ';'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_2_1());
                    }
                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_2_1());
                    }

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ImportCS__Alternatives_0"
    // InternalOCLinEcore.g:4001:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'library' ) );
    public final void rule__ImportCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4005: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:4006:1: ( 'import' )
                    {
                    // InternalOCLinEcore.g:4006:1: ( 'import' )
                    // InternalOCLinEcore.g:4007: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:4014:6: ( 'library' )
                    {
                    // InternalOCLinEcore.g:4014:6: ( 'library' )
                    // InternalOCLinEcore.g:4015: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:4027:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );
    public final void rule__ModelElementCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4031:1: ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) )
            int alt24=5;
            alt24 = dfa24.predict(input);
            switch (alt24) {
                case 1 :
                    // InternalOCLinEcore.g:4032:1: ( ruleClassCS )
                    {
                    // InternalOCLinEcore.g:4032:1: ( ruleClassCS )
                    // InternalOCLinEcore.g:4033: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:4038:6: ( ruleEnumerationLiteralCS )
                    {
                    // InternalOCLinEcore.g:4038:6: ( ruleEnumerationLiteralCS )
                    // InternalOCLinEcore.g:4039: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:4044:6: ( ruleOperationCS )
                    {
                    // InternalOCLinEcore.g:4044:6: ( ruleOperationCS )
                    // InternalOCLinEcore.g:4045: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:4050:6: ( rulePackageCS )
                    {
                    // InternalOCLinEcore.g:4050:6: ( rulePackageCS )
                    // InternalOCLinEcore.g:4051: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:4056:6: ( ruleStructuralFeatureCS )
                    {
                    // InternalOCLinEcore.g:4056:6: ( ruleStructuralFeatureCS )
                    // InternalOCLinEcore.g:4057: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:4067: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:4071: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:4072:1: ( ( rule__OperationCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4072:1: ( ( rule__OperationCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:4073:1: ( rule__OperationCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:4074:1: ( rule__OperationCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:4074: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:4078:6: ( ( rule__OperationCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4078:6: ( ( rule__OperationCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:4079:1: ( rule__OperationCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:4080:1: ( rule__OperationCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:4080: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:4089: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:4093: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 122:
                {
                alt26=2;
                }
                break;
            case 37:
                {
                alt26=3;
                }
                break;
            case 124:
                {
                alt26=4;
                }
                break;
            case 48:
                {
                alt26=5;
                }
                break;
            case 126:
                {
                alt26=6;
                }
                break;
            case 49:
                {
                alt26=7;
                }
                break;
            case 127:
                {
                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:4094:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4094:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
                    // InternalOCLinEcore.g:4095:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_0());
                    }
                    // InternalOCLinEcore.g:4096:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
                    // InternalOCLinEcore.g:4096: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:4100:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4100:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
                    // InternalOCLinEcore.g:4101:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_1());
                    }
                    // InternalOCLinEcore.g:4102:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
                    // InternalOCLinEcore.g:4102: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:4106:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4106:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
                    // InternalOCLinEcore.g:4107:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_2());
                    }
                    // InternalOCLinEcore.g:4108:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
                    // InternalOCLinEcore.g:4108: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:4112:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4112:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
                    // InternalOCLinEcore.g:4113:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_3());
                    }
                    // InternalOCLinEcore.g:4114:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
                    // InternalOCLinEcore.g:4114: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:4118:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:4118:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
                    // InternalOCLinEcore.g:4119:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_4());
                    }
                    // InternalOCLinEcore.g:4120:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
                    // InternalOCLinEcore.g:4120: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:4124:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:4124:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
                    // InternalOCLinEcore.g:4125:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_5());
                    }
                    // InternalOCLinEcore.g:4126:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
                    // InternalOCLinEcore.g:4126: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:4130:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:4130:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
                    // InternalOCLinEcore.g:4131:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_6());
                    }
                    // InternalOCLinEcore.g:4132:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
                    // InternalOCLinEcore.g:4132: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:4136:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:4136:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
                    // InternalOCLinEcore.g:4137:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_7());
                    }
                    // InternalOCLinEcore.g:4138:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
                    // InternalOCLinEcore.g:4138: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:4147: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:4151:1: ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) )
            int alt27=2;
            int LA27_0 = input.LA(1);

            if ( (LA27_0==100) ) {
                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:4152:1: ( ( rule__OperationCS__Group_10_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4152:1: ( ( rule__OperationCS__Group_10_0__0 ) )
                    // InternalOCLinEcore.g:4153:1: ( rule__OperationCS__Group_10_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_10_0());
                    }
                    // InternalOCLinEcore.g:4154:1: ( rule__OperationCS__Group_10_0__0 )
                    // InternalOCLinEcore.g:4154: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:4158:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4158:6: ( ';' )
                    // InternalOCLinEcore.g:4159: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:4171: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:4175: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 59:
                {
                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:4176:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4176:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
                    // InternalOCLinEcore.g:4177:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAssignment_10_0_1_0());
                    }
                    // InternalOCLinEcore.g:4178:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
                    // InternalOCLinEcore.g:4178: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:4182:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4182:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
                    // InternalOCLinEcore.g:4183:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedPreconditionsAssignment_10_0_1_1());
                    }
                    // InternalOCLinEcore.g:4184:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
                    // InternalOCLinEcore.g:4184: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:4188:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:4188:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
                    // InternalOCLinEcore.g:4189:1: ( rule__OperationCS__Group_10_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getGroup_10_0_1_2());
                    }
                    // InternalOCLinEcore.g:4190:1: ( rule__OperationCS__Group_10_0_1_2__0 )
                    // InternalOCLinEcore.g:4190: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:4194:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
                    {
                    // InternalOCLinEcore.g:4194:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
                    // InternalOCLinEcore.g:4195:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOperationCSAccess().getOwnedPostconditionsAssignment_10_0_1_3());
                    }
                    // InternalOCLinEcore.g:4196:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
                    // InternalOCLinEcore.g:4196: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:4205: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:4209:1: ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) )
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==100) ) {
                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:4210:1: ( ( rule__PackageCS__Group_4_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4210:1: ( ( rule__PackageCS__Group_4_0__0 ) )
                    // InternalOCLinEcore.g:4211:1: ( rule__PackageCS__Group_4_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getGroup_4_0());
                    }
                    // InternalOCLinEcore.g:4212:1: ( rule__PackageCS__Group_4_0__0 )
                    // InternalOCLinEcore.g:4212: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:4216:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4216:6: ( ';' )
                    // InternalOCLinEcore.g:4217: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:4229: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:4233: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 59:
                {
                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:4234:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4234:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                    // InternalOCLinEcore.g:4235:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                    }
                    // InternalOCLinEcore.g:4236:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
                    // InternalOCLinEcore.g:4236: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:4240:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4240:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
                    // InternalOCLinEcore.g:4241:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedPackagesAssignment_4_0_1_1());
                    }
                    // InternalOCLinEcore.g:4242:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
                    // InternalOCLinEcore.g:4242: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:4246:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:4246:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
                    // InternalOCLinEcore.g:4247:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPackageCSAccess().getOwnedClassesAssignment_4_0_1_2());
                    }
                    // InternalOCLinEcore.g:4248:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
                    // InternalOCLinEcore.g:4248: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:4257: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:4261: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 124:
                {
                alt31=2;
                }
                break;
            case 49:
                {
                alt31=3;
                }
                break;
            case 127:
                {
                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:4262:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4262:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
                    // InternalOCLinEcore.g:4263:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_0());
                    }
                    // InternalOCLinEcore.g:4264:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
                    // InternalOCLinEcore.g:4264: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:4268:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4268:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
                    // InternalOCLinEcore.g:4269:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_1());
                    }
                    // InternalOCLinEcore.g:4270:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
                    // InternalOCLinEcore.g:4270: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:4274:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4274:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
                    // InternalOCLinEcore.g:4275:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_2());
                    }
                    // InternalOCLinEcore.g:4276:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
                    // InternalOCLinEcore.g:4276: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:4280:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4280:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
                    // InternalOCLinEcore.g:4281:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_3());
                    }
                    // InternalOCLinEcore.g:4282:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
                    // InternalOCLinEcore.g:4282: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__ReferenceCS__Alternatives_0"
    // InternalOCLinEcore.g:4291: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:4295:1: ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) )
            int alt32=2;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==46) ) {
                alt32=1;
            }
            else if ( (LA32_0==24) ) {
                alt32=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 32, 0, input);

                throw nvae;
            }
            switch (alt32) {
                case 1 :
                    // InternalOCLinEcore.g:4296:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4296:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
                    // InternalOCLinEcore.g:4297:1: ( rule__ReferenceCS__Group_0_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_0_0());
                    }
                    // InternalOCLinEcore.g:4298:1: ( rule__ReferenceCS__Group_0_0__0 )
                    // InternalOCLinEcore.g:4298: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:4302:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4302:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
                    // InternalOCLinEcore.g:4303:1: ( rule__ReferenceCS__Group_0_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_0_1());
                    }
                    // InternalOCLinEcore.g:4304:1: ( rule__ReferenceCS__Group_0_1__0 )
                    // InternalOCLinEcore.g:4304: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:4313: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:4317: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 alt33=18;
            switch ( input.LA(1) ) {
            case 22:
                {
                alt33=1;
                }
                break;
            case 131:
                {
                alt33=2;
                }
                break;
            case 26:
                {
                alt33=3;
                }
                break;
            case 122:
                {
                alt33=4;
                }
                break;
            case 37:
                {
                alt33=5;
                }
                break;
            case 124:
                {
                alt33=6;
                }
                break;
            case 43:
                {
                alt33=7;
                }
                break;
            case 125:
                {
                alt33=8;
                }
                break;
            case 45:
                {
                alt33=9;
                }
                break;
            case 132:
                {
                alt33=10;
                }
                break;
            case 48:
                {
                alt33=11;
                }
                break;
            case 126:
                {
                alt33=12;
                }
                break;
            case 49:
                {
                alt33=13;
                }
                break;
            case 127:
                {
                alt33=14;
                }
                break;
            case 50:
                {
                alt33=15;
                }
                break;
            case 128:
                {
                alt33=16;
                }
                break;
            case 51:
                {
                alt33=17;
                }
                break;
            case 129:
                {
                alt33=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 33, 0, input);

                throw nvae;
            }

            switch (alt33) {
                case 1 :
                    // InternalOCLinEcore.g:4318:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
                    {
                    // InternalOCLinEcore.g:4318:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
                    // InternalOCLinEcore.g:4319:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_0());
                    }
                    // InternalOCLinEcore.g:4320:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
                    // InternalOCLinEcore.g:4320: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:4324:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
                    {
                    // InternalOCLinEcore.g:4324:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
                    // InternalOCLinEcore.g:4325:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_1());
                    }
                    // InternalOCLinEcore.g:4326:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
                    // InternalOCLinEcore.g:4326: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:4330:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
                    {
                    // InternalOCLinEcore.g:4330:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
                    // InternalOCLinEcore.g:4331:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_2());
                    }
                    // InternalOCLinEcore.g:4332:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
                    // InternalOCLinEcore.g:4332: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:4336:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
                    {
                    // InternalOCLinEcore.g:4336:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
                    // InternalOCLinEcore.g:4337:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_3());
                    }
                    // InternalOCLinEcore.g:4338:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
                    // InternalOCLinEcore.g:4338: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:4342:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
                    {
                    // InternalOCLinEcore.g:4342:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
                    // InternalOCLinEcore.g:4343:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_4());
                    }
                    // InternalOCLinEcore.g:4344:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
                    // InternalOCLinEcore.g:4344: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:4348:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
                    {
                    // InternalOCLinEcore.g:4348:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
                    // InternalOCLinEcore.g:4349:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_5());
                    }
                    // InternalOCLinEcore.g:4350:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
                    // InternalOCLinEcore.g:4350: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:4354:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
                    {
                    // InternalOCLinEcore.g:4354:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
                    // InternalOCLinEcore.g:4355:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_6());
                    }
                    // InternalOCLinEcore.g:4356:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
                    // InternalOCLinEcore.g:4356: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:4360:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
                    {
                    // InternalOCLinEcore.g:4360:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
                    // InternalOCLinEcore.g:4361:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_7());
                    }
                    // InternalOCLinEcore.g:4362:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
                    // InternalOCLinEcore.g:4362: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:4366:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
                    {
                    // InternalOCLinEcore.g:4366:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
                    // InternalOCLinEcore.g:4367:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_8());
                    }
                    // InternalOCLinEcore.g:4368:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
                    // InternalOCLinEcore.g:4368: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:4372:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
                    {
                    // InternalOCLinEcore.g:4372:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
                    // InternalOCLinEcore.g:4373:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_9());
                    }
                    // InternalOCLinEcore.g:4374:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
                    // InternalOCLinEcore.g:4374: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:4378:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
                    {
                    // InternalOCLinEcore.g:4378:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
                    // InternalOCLinEcore.g:4379:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_10());
                    }
                    // InternalOCLinEcore.g:4380:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
                    // InternalOCLinEcore.g:4380: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:4384:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
                    {
                    // InternalOCLinEcore.g:4384:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
                    // InternalOCLinEcore.g:4385:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_11());
                    }
                    // InternalOCLinEcore.g:4386:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
                    // InternalOCLinEcore.g:4386: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:4390:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
                    {
                    // InternalOCLinEcore.g:4390:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
                    // InternalOCLinEcore.g:4391:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_12());
                    }
                    // InternalOCLinEcore.g:4392:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
                    // InternalOCLinEcore.g:4392: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:4396:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
                    {
                    // InternalOCLinEcore.g:4396:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
                    // InternalOCLinEcore.g:4397:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_13());
                    }
                    // InternalOCLinEcore.g:4398:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
                    // InternalOCLinEcore.g:4398: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:4402:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
                    {
                    // InternalOCLinEcore.g:4402:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
                    // InternalOCLinEcore.g:4403:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_14());
                    }
                    // InternalOCLinEcore.g:4404:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
                    // InternalOCLinEcore.g:4404: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:4408:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
                    {
                    // InternalOCLinEcore.g:4408:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
                    // InternalOCLinEcore.g:4409:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_15());
                    }
                    // InternalOCLinEcore.g:4410:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
                    // InternalOCLinEcore.g:4410: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:4414:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
                    {
                    // InternalOCLinEcore.g:4414:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
                    // InternalOCLinEcore.g:4415:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_16());
                    }
                    // InternalOCLinEcore.g:4416:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
                    // InternalOCLinEcore.g:4416: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:4420:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
                    {
                    // InternalOCLinEcore.g:4420:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
                    // InternalOCLinEcore.g:4421:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_17());
                    }
                    // InternalOCLinEcore.g:4422:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
                    // InternalOCLinEcore.g:4422: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:4431: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:4435:1: ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) )
            int alt34=2;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==100) ) {
                alt34=1;
            }
            else if ( (LA34_0==52) ) {
                alt34=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;
            }
            switch (alt34) {
                case 1 :
                    // InternalOCLinEcore.g:4436:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4436:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
                    // InternalOCLinEcore.g:4437:1: ( rule__ReferenceCS__Group_7_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0());
                    }
                    // InternalOCLinEcore.g:4438:1: ( rule__ReferenceCS__Group_7_0__0 )
                    // InternalOCLinEcore.g:4438: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:4442:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4442:6: ( ';' )
                    // InternalOCLinEcore.g:4443: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:4455: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 ) ) );
    public final void rule__ReferenceCS__Alternatives_7_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4459: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 ) ) )
            int alt35=4;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 59:
                {
                alt35=1;
                }
                break;
            case 33:
                {
                alt35=2;
                }
                break;
            case 31:
                {
                alt35=3;
                }
                break;
            case 25:
                {
                alt35=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 35, 0, input);

                throw nvae;
            }

            switch (alt35) {
                case 1 :
                    // InternalOCLinEcore.g:4460:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4460:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    // InternalOCLinEcore.g:4461:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }
                    // InternalOCLinEcore.g:4462:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    // InternalOCLinEcore.g:4462: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:4466:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4466:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
                    // InternalOCLinEcore.g:4467:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1());
                    }
                    // InternalOCLinEcore.g:4468:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
                    // InternalOCLinEcore.g:4468: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:4472:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
                    {
                    // InternalOCLinEcore.g:4472:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
                    // InternalOCLinEcore.g:4473:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_2());
                    }
                    // InternalOCLinEcore.g:4474:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
                    // InternalOCLinEcore.g:4474: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:4478:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
                    {
                    // InternalOCLinEcore.g:4478:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
                    // InternalOCLinEcore.g:4479:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_3());
                    }
                    // InternalOCLinEcore.g:4480:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
                    // InternalOCLinEcore.g:4480: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;

            }
        }
        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:4489: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:4493:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
            int alt36=2;
            int LA36_0 = input.LA(1);

            if ( ((LA36_0>=RULE_INT && LA36_0<=RULE_SINGLE_QUOTED_STRING)||(LA36_0>=RULE_SIMPLE_ID && LA36_0<=RULE_ESCAPED_ID)||(LA36_0>=17 && LA36_0<=51)||(LA36_0>=54 && LA36_0<=62)||(LA36_0>=79 && LA36_0<=93)||LA36_0==96||LA36_0==106||(LA36_0>=108 && LA36_0<=109)||LA36_0==114||(LA36_0>=119 && LA36_0<=120)||(LA36_0>=133 && LA36_0<=134)) ) {
                alt36=1;
            }
            else if ( (LA36_0==RULE_UNQUOTED_STRING) ) {
                alt36=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 36, 0, input);

                throw nvae;
            }
            switch (alt36) {
                case 1 :
                    // InternalOCLinEcore.g:4494:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:4494:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                    // InternalOCLinEcore.g:4495:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionAssignment_0());
                    }
                    // InternalOCLinEcore.g:4496:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                    // InternalOCLinEcore.g:4496: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:4500:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:4500:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                    // InternalOCLinEcore.g:4501:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSpecificationCSAccess().getExprStringAssignment_1());
                    }
                    // InternalOCLinEcore.g:4502:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                    // InternalOCLinEcore.g:4502: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:4511: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:4515:1: ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) )
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==100) ) {
                alt37=1;
            }
            else if ( (LA37_0==52) ) {
                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:4516:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4516:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
                    // InternalOCLinEcore.g:4517:1: ( rule__StructuredClassCS__Group_7_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getGroup_7_0());
                    }
                    // InternalOCLinEcore.g:4518:1: ( rule__StructuredClassCS__Group_7_0__0 )
                    // InternalOCLinEcore.g:4518: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:4522:6: ( ';' )
                    {
                    // InternalOCLinEcore.g:4522:6: ( ';' )
                    // InternalOCLinEcore.g:4523: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:4535: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:4539: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 alt38=4;
            switch ( input.LA(1) ) {
            case 54:
            case 55:
            case 59:
                {
                alt38=1;
                }
                break;
            case 46:
                {
                switch ( input.LA(2) ) {
                case 24:
                    {
                    int LA38_7 = input.LA(3);

                    if ( (LA38_7==18||LA38_7==42) ) {
                        alt38=3;
                    }
                    else if ( (LA38_7==36) ) {
                        alt38=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 38, 7, input);

                        throw nvae;
                    }
                    }
                    break;
                case 36:
                    {
                    alt38=2;
                    }
                    break;
                case 18:
                case 42:
                    {
                    alt38=3;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 38, 2, input);

                    throw nvae;
                }

                }
                break;
            case 24:
                {
                switch ( input.LA(2) ) {
                case 46:
                    {
                    int LA38_8 = input.LA(3);

                    if ( (LA38_8==18||LA38_8==42) ) {
                        alt38=3;
                    }
                    else if ( (LA38_8==36) ) {
                        alt38=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 38, 8, input);

                        throw nvae;
                    }
                    }
                    break;
                case 36:
                    {
                    alt38=2;
                    }
                    break;
                case 18:
                case 42:
                    {
                    alt38=3;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 38, 3, input);

                    throw nvae;
                }

                }
                break;
            case 36:
                {
                alt38=2;
                }
                break;
            case 18:
            case 42:
                {
                alt38=3;
                }
                break;
            case 20:
            case 56:
                {
                alt38=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 38, 0, input);

                throw nvae;
            }

            switch (alt38) {
                case 1 :
                    // InternalOCLinEcore.g:4540:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    {
                    // InternalOCLinEcore.g:4540:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                    // InternalOCLinEcore.g:4541:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                    }
                    // InternalOCLinEcore.g:4542:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
                    // InternalOCLinEcore.g:4542: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:4546:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
                    {
                    // InternalOCLinEcore.g:4546:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
                    // InternalOCLinEcore.g:4547:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsAssignment_7_0_1_1());
                    }
                    // InternalOCLinEcore.g:4548:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
                    // InternalOCLinEcore.g:4548: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:4552:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
                    {
                    // InternalOCLinEcore.g:4552:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
                    // InternalOCLinEcore.g:4553:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesAssignment_7_0_1_2());
                    }
                    // InternalOCLinEcore.g:4554:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
                    // InternalOCLinEcore.g:4554: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:4558:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
                    {
                    // InternalOCLinEcore.g:4558:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
                    // InternalOCLinEcore.g:4559:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsAssignment_7_0_1_3());
                    }
                    // InternalOCLinEcore.g:4560:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
                    // InternalOCLinEcore.g:4560: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:4569:1: rule__StructuralFeatureCS__Alternatives : ( ( ruleAttributeCS ) | ( ruleReferenceCS ) );
    public final void rule__StructuralFeatureCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4573:1: ( ( ruleAttributeCS ) | ( ruleReferenceCS ) )
            int alt39=2;
            switch ( input.LA(1) ) {
            case 46:
                {
                switch ( input.LA(2) ) {
                case 24:
                    {
                    int LA39_5 = input.LA(3);

                    if ( (LA39_5==42) ) {
                        alt39=2;
                    }
                    else if ( (LA39_5==18) ) {
                        alt39=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 5, input);

                        throw nvae;
                    }
                    }
                    break;
                case 42:
                    {
                    alt39=2;
                    }
                    break;
                case 18:
                    {
                    alt39=1;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 39, 1, input);

                    throw nvae;
                }

                }
                break;
            case 24:
                {
                switch ( input.LA(2) ) {
                case 46:
                    {
                    int LA39_6 = input.LA(3);

                    if ( (LA39_6==42) ) {
                        alt39=2;
                    }
                    else if ( (LA39_6==18) ) {
                        alt39=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return ;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 6, input);

                        throw nvae;
                    }
                    }
                    break;
                case 18:
                    {
                    alt39=1;
                    }
                    break;
                case 42:
                    {
                    alt39=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 39, 2, input);

                    throw nvae;
                }

                }
                break;
            case 18:
                {
                alt39=1;
                }
                break;
            case 42:
                {
                alt39=2;
                }
                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:4574:1: ( ruleAttributeCS )
                    {
                    // InternalOCLinEcore.g:4574:1: ( ruleAttributeCS )
                    // InternalOCLinEcore.g:4575: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:4580:6: ( ruleReferenceCS )
                    {
                    // InternalOCLinEcore.g:4580:6: ( ruleReferenceCS )
                    // InternalOCLinEcore.g:4581: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:4591: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:4595:1: ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) )
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==RULE_SINGLE_QUOTED_STRING||(LA40_0>=RULE_SIMPLE_ID && LA40_0<=RULE_ESCAPED_ID)||(LA40_0>=17 && LA40_0<=51)||(LA40_0>=54 && LA40_0<=59)) ) {
                alt40=1;
            }
            else if ( (LA40_0==100) ) {
                alt40=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 40, 0, input);

                throw nvae;
            }
            switch (alt40) {
                case 1 :
                    // InternalOCLinEcore.g:4596:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4596:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
                    // InternalOCLinEcore.g:4597:1: ( rule__SysMLCS__Group_2_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSysMLCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:4598:1: ( rule__SysMLCS__Group_2_0__0 )
                    // InternalOCLinEcore.g:4598: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:4602:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4602:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
                    // InternalOCLinEcore.g:4603:1: ( rule__SysMLCS__Group_2_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getSysMLCSAccess().getGroup_2_1());
                    }
                    // InternalOCLinEcore.g:4604:1: ( rule__SysMLCS__Group_2_1__0 )
                    // InternalOCLinEcore.g:4604: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:4614: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:4618:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
            int alt41=2;
            int LA41_0 = input.LA(1);

            if ( (LA41_0==96) ) {
                alt41=1;
            }
            else if ( (LA41_0==66) ) {
                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:4619:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4619:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:4620:1: ( rule__TemplateSignatureCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:4621:1: ( rule__TemplateSignatureCS__Group_0__0 )
                    // InternalOCLinEcore.g:4621: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:4625:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4625:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:4626:1: ( rule__TemplateSignatureCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:4627:1: ( rule__TemplateSignatureCS__Group_1__0 )
                    // InternalOCLinEcore.g:4627: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:4636:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
    public final void rule__TypedRefCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4640:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( ((LA42_0>=79 && LA42_0<=93)) ) {
                alt42=1;
            }
            else if ( ((LA42_0>=RULE_SIMPLE_ID && LA42_0<=RULE_ESCAPED_ID)||(LA42_0>=17 && LA42_0<=51)||(LA42_0>=54 && LA42_0<=59)) ) {
                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:4641:1: ( ruleTypeLiteralCS )
                    {
                    // InternalOCLinEcore.g:4641:1: ( ruleTypeLiteralCS )
                    // InternalOCLinEcore.g:4642: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:4647:6: ( ruleTypedTypeRefCS )
                    {
                    // InternalOCLinEcore.g:4647:6: ( ruleTypedTypeRefCS )
                    // InternalOCLinEcore.g:4648: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:4658: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:4662:1: ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) )
            int alt43=2;
            int LA43_0 = input.LA(1);

            if ( (LA43_0==96) ) {
                alt43=1;
            }
            else if ( (LA43_0==66) ) {
                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:4663:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
                    {
                    // InternalOCLinEcore.g:4663:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
                    // InternalOCLinEcore.g:4664:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_0());
                    }
                    // InternalOCLinEcore.g:4665:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
                    // InternalOCLinEcore.g:4665: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:4669:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:4669:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
                    // InternalOCLinEcore.g:4670:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_1());
                    }
                    // InternalOCLinEcore.g:4671:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
                    // InternalOCLinEcore.g:4671: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:4680:1: rule__UnrestrictedName__Alternatives : ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'serializable' ) | ( 'sysml' ) );
    public final void rule__UnrestrictedName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4684:1: ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'serializable' ) | ( 'sysml' ) )
            int alt44=7;
            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:
                {
                alt44=1;
                }
                break;
            case 54:
                {
                alt44=2;
                }
                break;
            case 55:
                {
                alt44=3;
                }
                break;
            case 56:
                {
                alt44=4;
                }
                break;
            case 57:
                {
                alt44=5;
                }
                break;
            case 58:
                {
                alt44=6;
                }
                break;
            case 59:
                {
                alt44=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 44, 0, input);

                throw nvae;
            }

            switch (alt44) {
                case 1 :
                    // InternalOCLinEcore.g:4685:1: ( ruleEnumerationLiteralName )
                    {
                    // InternalOCLinEcore.g:4685:1: ( ruleEnumerationLiteralName )
                    // InternalOCLinEcore.g:4686: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:4691:6: ( 'annotation' )
                    {
                    // InternalOCLinEcore.g:4691:6: ( 'annotation' )
                    // InternalOCLinEcore.g:4692: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:4699:6: ( 'documentation' )
                    {
                    // InternalOCLinEcore.g:4699:6: ( 'documentation' )
                    // InternalOCLinEcore.g:4700: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:4707:6: ( 'invariant' )
                    {
                    // InternalOCLinEcore.g:4707:6: ( 'invariant' )
                    // InternalOCLinEcore.g:4708: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:4715:6: ( 'literal' )
                    {
                    // InternalOCLinEcore.g:4715:6: ( 'literal' )
                    // InternalOCLinEcore.g:4716: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:4723:6: ( 'serializable' )
                    {
                    // InternalOCLinEcore.g:4723:6: ( 'serializable' )
                    // InternalOCLinEcore.g:4724:1: 'serializable'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_5());
                    }
                    match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4731:6: ( 'sysml' )
                    {
                    // InternalOCLinEcore.g:4731:6: ( 'sysml' )
                    // InternalOCLinEcore.g:4732:1: 'sysml'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_6());
                    }
                    match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_6());
                    }

                    }


                    }
                    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:4745:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) );
    public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4749:1: ( ( '-' ) | ( 'not' ) )
            int alt45=2;
            int LA45_0 = input.LA(1);

            if ( (LA45_0==60) ) {
                alt45=1;
            }
            else if ( (LA45_0==61) ) {
                alt45=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;
            }
            switch (alt45) {
                case 1 :
                    // InternalOCLinEcore.g:4750:1: ( '-' )
                    {
                    // InternalOCLinEcore.g:4750:1: ( '-' )
                    // InternalOCLinEcore.g:4751:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
                    }
                    match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4758:6: ( 'not' )
                    {
                    // InternalOCLinEcore.g:4758:6: ( 'not' )
                    // InternalOCLinEcore.g:4759:1: 'not'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
                    }
                    match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
                    }

                    }


                    }
                    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:4771:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'or' ) | ( 'xor' ) | ( 'implies' ) );
    public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4775:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'or' ) | ( 'xor' ) | ( 'implies' ) )
            int alt46=14;
            switch ( input.LA(1) ) {
            case 62:
                {
                alt46=1;
                }
                break;
            case 63:
                {
                alt46=2;
                }
                break;
            case 64:
                {
                alt46=3;
                }
                break;
            case 60:
                {
                alt46=4;
                }
                break;
            case 65:
                {
                alt46=5;
                }
                break;
            case 66:
                {
                alt46=6;
                }
                break;
            case 67:
                {
                alt46=7;
                }
                break;
            case 68:
                {
                alt46=8;
                }
                break;
            case 69:
                {
                alt46=9;
                }
                break;
            case 70:
                {
                alt46=10;
                }
                break;
            case 71:
                {
                alt46=11;
                }
                break;
            case 72:
                {
                alt46=12;
                }
                break;
            case 73:
                {
                alt46=13;
                }
                break;
            case 74:
                {
                alt46=14;
                }
                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:4776:1: ( '*' )
                    {
                    // InternalOCLinEcore.g:4776:1: ( '*' )
                    // InternalOCLinEcore.g:4777:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
                    }
                    match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4784:6: ( '/' )
                    {
                    // InternalOCLinEcore.g:4784:6: ( '/' )
                    // InternalOCLinEcore.g:4785:1: '/'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
                    }
                    match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4792:6: ( '+' )
                    {
                    // InternalOCLinEcore.g:4792:6: ( '+' )
                    // InternalOCLinEcore.g:4793:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
                    }
                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4800:6: ( '-' )
                    {
                    // InternalOCLinEcore.g:4800:6: ( '-' )
                    // InternalOCLinEcore.g:4801:1: '-'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
                    }
                    match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4808:6: ( '>' )
                    {
                    // InternalOCLinEcore.g:4808:6: ( '>' )
                    // InternalOCLinEcore.g:4809:1: '>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
                    }
                    match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:4816:6: ( '<' )
                    {
                    // InternalOCLinEcore.g:4816:6: ( '<' )
                    // InternalOCLinEcore.g:4817:1: '<'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
                    }
                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:4824:6: ( '>=' )
                    {
                    // InternalOCLinEcore.g:4824:6: ( '>=' )
                    // InternalOCLinEcore.g:4825:1: '>='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
                    }
                    match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:4832:6: ( '<=' )
                    {
                    // InternalOCLinEcore.g:4832:6: ( '<=' )
                    // InternalOCLinEcore.g:4833:1: '<='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
                    }
                    match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalOCLinEcore.g:4840:6: ( '=' )
                    {
                    // InternalOCLinEcore.g:4840:6: ( '=' )
                    // InternalOCLinEcore.g:4841:1: '='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
                    }
                    match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalOCLinEcore.g:4848:6: ( '<>' )
                    {
                    // InternalOCLinEcore.g:4848:6: ( '<>' )
                    // InternalOCLinEcore.g:4849:1: '<>'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
                    }
                    match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalOCLinEcore.g:4856:6: ( 'and' )
                    {
                    // InternalOCLinEcore.g:4856:6: ( 'and' )
                    // InternalOCLinEcore.g:4857:1: 'and'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
                    }
                    match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalOCLinEcore.g:4864:6: ( 'or' )
                    {
                    // InternalOCLinEcore.g:4864:6: ( 'or' )
                    // InternalOCLinEcore.g:4865:1: 'or'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_11());
                    }
                    match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_11());
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalOCLinEcore.g:4872:6: ( 'xor' )
                    {
                    // InternalOCLinEcore.g:4872:6: ( 'xor' )
                    // InternalOCLinEcore.g:4873:1: 'xor'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_12());
                    }
                    match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_12());
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalOCLinEcore.g:4880:6: ( 'implies' )
                    {
                    // InternalOCLinEcore.g:4880:6: ( 'implies' )
                    // InternalOCLinEcore.g:4881:1: 'implies'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_13());
                    }
                    match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_13());
                    }

                    }


                    }
                    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:4893:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
    public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4897:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
            int alt47=4;
            switch ( input.LA(1) ) {
            case 75:
                {
                alt47=1;
                }
                break;
            case 76:
                {
                alt47=2;
                }
                break;
            case 77:
                {
                alt47=3;
                }
                break;
            case 78:
                {
                alt47=4;
                }
                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:4898:1: ( '.' )
                    {
                    // InternalOCLinEcore.g:4898:1: ( '.' )
                    // InternalOCLinEcore.g:4899:1: '.'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
                    }
                    match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:4906:6: ( '->' )
                    {
                    // InternalOCLinEcore.g:4906:6: ( '->' )
                    // InternalOCLinEcore.g:4907:1: '->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
                    }
                    match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:4914:6: ( '?.' )
                    {
                    // InternalOCLinEcore.g:4914:6: ( '?.' )
                    // InternalOCLinEcore.g:4915:1: '?.'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
                    }
                    match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:4922:6: ( '?->' )
                    {
                    // InternalOCLinEcore.g:4922:6: ( '?->' )
                    // InternalOCLinEcore.g:4923:1: '?->'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
                    }
                    match(input,78,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:4935:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
    public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4939:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
            int alt48=2;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==60||(LA48_0>=62 && LA48_0<=74)) ) {
                alt48=1;
            }
            else if ( ((LA48_0>=75 && LA48_0<=78)) ) {
                alt48=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 48, 0, input);

                throw nvae;
            }
            switch (alt48) {
                case 1 :
                    // InternalOCLinEcore.g:4940:1: ( ruleInfixOperatorName )
                    {
                    // InternalOCLinEcore.g:4940:1: ( ruleInfixOperatorName )
                    // InternalOCLinEcore.g:4941: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:4946:6: ( ruleNavigationOperatorName )
                    {
                    // InternalOCLinEcore.g:4946:6: ( ruleNavigationOperatorName )
                    // InternalOCLinEcore.g:4947: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:4957:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
    public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:4961:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
            int alt49=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:
                {
                alt49=1;
                }
                break;
            case 89:
            case 90:
            case 91:
            case 92:
            case 93:
                {
                alt49=2;
                }
                break;
            case 81:
            case 82:
            case 83:
            case 84:
            case 85:
            case 86:
            case 87:
            case 88:
                {
                alt49=3;
                }
                break;
            case 79:
                {
                alt49=4;
                }
                break;
            case 80:
                {
                alt49=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 49, 0, input);

                throw nvae;
            }

            switch (alt49) {
                case 1 :
                    // InternalOCLinEcore.g:4962:1: ( ruleUnrestrictedName )
                    {
                    // InternalOCLinEcore.g:4962:1: ( ruleUnrestrictedName )
                    // InternalOCLinEcore.g:4963: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:4968:6: ( ruleCollectionTypeIdentifier )
                    {
                    // InternalOCLinEcore.g:4968:6: ( ruleCollectionTypeIdentifier )
                    // InternalOCLinEcore.g:4969: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:4974:6: ( rulePrimitiveTypeIdentifier )
                    {
                    // InternalOCLinEcore.g:4974:6: ( rulePrimitiveTypeIdentifier )
                    // InternalOCLinEcore.g:4975: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:4980:6: ( 'Map' )
                    {
                    // InternalOCLinEcore.g:4980:6: ( 'Map' )
                    // InternalOCLinEcore.g:4981:1: 'Map'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
                    }
                    match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:4988:6: ( 'Tuple' )
                    {
                    // InternalOCLinEcore.g:4988:6: ( 'Tuple' )
                    // InternalOCLinEcore.g:4989:1: 'Tuple'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
                    }
                    match(input,80,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:5001: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:5005:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( ((LA50_0>=RULE_SIMPLE_ID && LA50_0<=RULE_ESCAPED_ID)||(LA50_0>=17 && LA50_0<=51)||(LA50_0>=54 && LA50_0<=59)) ) {
                alt50=1;
            }
            else if ( (LA50_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt50=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 50, 0, input);

                throw nvae;
            }
            switch (alt50) {
                case 1 :
                    // InternalOCLinEcore.g:5006:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:5006:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                    // InternalOCLinEcore.g:5007:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                    }
                    // InternalOCLinEcore.g:5008:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                    // InternalOCLinEcore.g:5008: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:5012:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5012:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:5013:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:5014:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                    // InternalOCLinEcore.g:5014: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:5023: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:5027:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
            int alt51=8;
            switch ( input.LA(1) ) {
            case 81:
                {
                alt51=1;
                }
                break;
            case 82:
                {
                alt51=2;
                }
                break;
            case 83:
                {
                alt51=3;
                }
                break;
            case 84:
                {
                alt51=4;
                }
                break;
            case 85:
                {
                alt51=5;
                }
                break;
            case 86:
                {
                alt51=6;
                }
                break;
            case 87:
                {
                alt51=7;
                }
                break;
            case 88:
                {
                alt51=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 51, 0, input);

                throw nvae;
            }

            switch (alt51) {
                case 1 :
                    // InternalOCLinEcore.g:5028:1: ( 'Boolean' )
                    {
                    // InternalOCLinEcore.g:5028:1: ( 'Boolean' )
                    // InternalOCLinEcore.g:5029:1: 'Boolean'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
                    }
                    match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5036:6: ( 'Integer' )
                    {
                    // InternalOCLinEcore.g:5036:6: ( 'Integer' )
                    // InternalOCLinEcore.g:5037:1: 'Integer'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
                    }
                    match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5044:6: ( 'Real' )
                    {
                    // InternalOCLinEcore.g:5044:6: ( 'Real' )
                    // InternalOCLinEcore.g:5045:1: 'Real'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
                    }
                    match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5052:6: ( 'String' )
                    {
                    // InternalOCLinEcore.g:5052:6: ( 'String' )
                    // InternalOCLinEcore.g:5053:1: 'String'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
                    }
                    match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5060:6: ( 'UnlimitedNatural' )
                    {
                    // InternalOCLinEcore.g:5060:6: ( 'UnlimitedNatural' )
                    // InternalOCLinEcore.g:5061:1: 'UnlimitedNatural'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
                    }
                    match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalOCLinEcore.g:5068:6: ( 'OclAny' )
                    {
                    // InternalOCLinEcore.g:5068:6: ( 'OclAny' )
                    // InternalOCLinEcore.g:5069:1: 'OclAny'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
                    }
                    match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalOCLinEcore.g:5076:6: ( 'OclInvalid' )
                    {
                    // InternalOCLinEcore.g:5076:6: ( 'OclInvalid' )
                    // InternalOCLinEcore.g:5077:1: 'OclInvalid'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
                    }
                    match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalOCLinEcore.g:5084:6: ( 'OclVoid' )
                    {
                    // InternalOCLinEcore.g:5084:6: ( 'OclVoid' )
                    // InternalOCLinEcore.g:5085:1: 'OclVoid'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
                    }
                    match(input,88,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:5097:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
    public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5101:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
            int alt52=5;
            switch ( input.LA(1) ) {
            case 89:
                {
                alt52=1;
                }
                break;
            case 90:
                {
                alt52=2;
                }
                break;
            case 91:
                {
                alt52=3;
                }
                break;
            case 92:
                {
                alt52=4;
                }
                break;
            case 93:
                {
                alt52=5;
                }
                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:5102:1: ( 'Set' )
                    {
                    // InternalOCLinEcore.g:5102:1: ( 'Set' )
                    // InternalOCLinEcore.g:5103:1: 'Set'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
                    }
                    match(input,89,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5110:6: ( 'Bag' )
                    {
                    // InternalOCLinEcore.g:5110:6: ( 'Bag' )
                    // InternalOCLinEcore.g:5111:1: 'Bag'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
                    }
                    match(input,90,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5118:6: ( 'Sequence' )
                    {
                    // InternalOCLinEcore.g:5118:6: ( 'Sequence' )
                    // InternalOCLinEcore.g:5119:1: 'Sequence'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
                    }
                    match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalOCLinEcore.g:5126:6: ( 'Collection' )
                    {
                    // InternalOCLinEcore.g:5126:6: ( 'Collection' )
                    // InternalOCLinEcore.g:5127:1: 'Collection'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
                    }
                    match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalOCLinEcore.g:5134:6: ( 'OrderedSet' )
                    {
                    // InternalOCLinEcore.g:5134:6: ( 'OrderedSet' )
                    // InternalOCLinEcore.g:5135:1: 'OrderedSet'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
                    }
                    match(input,93,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:5147: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:5151:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
            int alt53=2;
            alt53 = dfa53.predict(input);
            switch (alt53) {
                case 1 :
                    // InternalOCLinEcore.g:5152:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5152:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5153:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5154:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                    // InternalOCLinEcore.g:5154: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:5158:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:5158:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                    // InternalOCLinEcore.g:5159:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                    }
                    // InternalOCLinEcore.g:5160:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                    // InternalOCLinEcore.g:5160: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__OwnedInitExpressionAlternatives_2_0"
    // InternalOCLinEcore.g:5169:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
    public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5173:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
            int alt54=2;
            alt54 = dfa54.predict(input);
            switch (alt54) {
                case 1 :
                    // InternalOCLinEcore.g:5174:1: ( ruleExpCS )
                    {
                    // InternalOCLinEcore.g:5174:1: ( ruleExpCS )
                    // InternalOCLinEcore.g:5175:1: ruleExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleExpCS();

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

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5180:6: ( rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:5180:6: ( rulePatternExpCS )
                    // InternalOCLinEcore.g:5181:1: rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_2_0_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    rulePatternExpCS();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
    // InternalOCLinEcore.g:5191:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
    public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5195:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
            int alt55=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt55=1;
                }
                break;
            case RULE_SINGLE_QUOTED_STRING:
                {
                alt55=2;
                }
                break;
            case 133:
            case 134:
                {
                alt55=3;
                }
                break;
            case 62:
                {
                alt55=4;
                }
                break;
            case 108:
                {
                alt55=5;
                }
                break;
            case 109:
                {
                alt55=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 55, 0, input);

                throw nvae;
            }

            switch (alt55) {
                case 1 :
                    // InternalOCLinEcore.g:5196:1: ( ruleNumberLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5196:1: ( ruleNumberLiteralExpCS )
                    // InternalOCLinEcore.g:5197: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:5202:6: ( ruleStringLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5202:6: ( ruleStringLiteralExpCS )
                    // InternalOCLinEcore.g:5203: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:5208:6: ( ruleBooleanLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5208:6: ( ruleBooleanLiteralExpCS )
                    // InternalOCLinEcore.g:5209: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:5214:6: ( ruleUnlimitedNaturalLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5214:6: ( ruleUnlimitedNaturalLiteralExpCS )
                    // InternalOCLinEcore.g:5215: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:5220:6: ( ruleInvalidLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5220:6: ( ruleInvalidLiteralExpCS )
                    // InternalOCLinEcore.g:5221: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:5226:6: ( ruleNullLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5226:6: ( ruleNullLiteralExpCS )
                    // InternalOCLinEcore.g:5227: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:5237: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:5241:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==133) ) {
                alt56=1;
            }
            else if ( (LA56_0==134) ) {
                alt56=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 56, 0, input);

                throw nvae;
            }
            switch (alt56) {
                case 1 :
                    // InternalOCLinEcore.g:5242:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                    {
                    // InternalOCLinEcore.g:5242:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                    // InternalOCLinEcore.g:5243:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                    }
                    // InternalOCLinEcore.g:5244:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                    // InternalOCLinEcore.g:5244: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:5248:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                    {
                    // InternalOCLinEcore.g:5248:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                    // InternalOCLinEcore.g:5249:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                    }
                    // InternalOCLinEcore.g:5250:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                    // InternalOCLinEcore.g:5250: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:5259:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
    public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5263:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
            int alt57=4;
            switch ( input.LA(1) ) {
            case 81:
            case 82:
            case 83:
            case 84:
            case 85:
            case 86:
            case 87:
            case 88:
                {
                alt57=1;
                }
                break;
            case 89:
            case 90:
            case 91:
            case 92:
            case 93:
                {
                alt57=2;
                }
                break;
            case 79:
                {
                alt57=3;
                }
                break;
            case 80:
                {
                alt57=4;
                }
                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:5264:1: ( rulePrimitiveTypeCS )
                    {
                    // InternalOCLinEcore.g:5264:1: ( rulePrimitiveTypeCS )
                    // InternalOCLinEcore.g:5265: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:5270:6: ( ruleCollectionTypeCS )
                    {
                    // InternalOCLinEcore.g:5270:6: ( ruleCollectionTypeCS )
                    // InternalOCLinEcore.g:5271: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:5276:6: ( ruleMapTypeCS )
                    {
                    // InternalOCLinEcore.g:5276:6: ( ruleMapTypeCS )
                    // InternalOCLinEcore.g:5277: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:5282:6: ( ruleTupleTypeCS )
                    {
                    // InternalOCLinEcore.g:5282:6: ( ruleTupleTypeCS )
                    // InternalOCLinEcore.g:5283: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__TypeExpCS__Alternatives_0"
    // InternalOCLinEcore.g:5293:1: rule__TypeExpCS__Alternatives_0 : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
    public final void rule__TypeExpCS__Alternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5297:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
            int alt58=3;
            alt58 = dfa58.predict(input);
            switch (alt58) {
                case 1 :
                    // InternalOCLinEcore.g:5298:1: ( ruleTypeNameExpCS )
                    {
                    // InternalOCLinEcore.g:5298:1: ( ruleTypeNameExpCS )
                    // InternalOCLinEcore.g:5299:1: ruleTypeNameExpCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpCSAccess().getTypeNameExpCSParserRuleCall_0_0());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeNameExpCS();

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

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5304:6: ( ruleTypeLiteralCS )
                    {
                    // InternalOCLinEcore.g:5304:6: ( ruleTypeLiteralCS )
                    // InternalOCLinEcore.g:5305:1: ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpCSAccess().getTypeLiteralCSParserRuleCall_0_1());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleTypeLiteralCS();

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

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5310:6: ( ruleCollectionPatternCS )
                    {
                    // InternalOCLinEcore.g:5310:6: ( ruleCollectionPatternCS )
                    // InternalOCLinEcore.g:5311:1: ruleCollectionPatternCS
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getTypeExpCSAccess().getCollectionPatternCSParserRuleCall_0_2());
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleCollectionPatternCS();

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ExpCS__Alternatives"
    // InternalOCLinEcore.g:5321:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
    public final void rule__ExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5325:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
            int alt59=2;
            alt59 = dfa59.predict(input);
            switch (alt59) {
                case 1 :
                    // InternalOCLinEcore.g:5326:1: ( ( rule__ExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5326:1: ( ( rule__ExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5327:1: ( rule__ExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5328:1: ( rule__ExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5328: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:5332:6: ( rulePrefixedLetExpCS )
                    {
                    // InternalOCLinEcore.g:5332:6: ( rulePrefixedLetExpCS )
                    // InternalOCLinEcore.g:5333: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:5343:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
    public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5347:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
            int alt60=2;
            int LA60_0 = input.LA(1);

            if ( ((LA60_0>=60 && LA60_0<=61)) ) {
                alt60=1;
            }
            else if ( (LA60_0==119) ) {
                alt60=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 60, 0, input);

                throw nvae;
            }
            switch (alt60) {
                case 1 :
                    // InternalOCLinEcore.g:5348:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5348:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5349:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5350:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5350: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:5354:6: ( ruleLetExpCS )
                    {
                    // InternalOCLinEcore.g:5354:6: ( ruleLetExpCS )
                    // InternalOCLinEcore.g:5355: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:5365:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
    public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5369:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
            int alt61=2;
            int LA61_0 = input.LA(1);

            if ( ((LA61_0>=60 && LA61_0<=61)) ) {
                alt61=1;
            }
            else if ( ((LA61_0>=RULE_INT && LA61_0<=RULE_SINGLE_QUOTED_STRING)||(LA61_0>=RULE_SIMPLE_ID && LA61_0<=RULE_ESCAPED_ID)||(LA61_0>=17 && LA61_0<=51)||(LA61_0>=54 && LA61_0<=59)||LA61_0==62||(LA61_0>=79 && LA61_0<=93)||LA61_0==96||LA61_0==106||(LA61_0>=108 && LA61_0<=109)||LA61_0==114||LA61_0==120||(LA61_0>=133 && LA61_0<=134)) ) {
                alt61=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 61, 0, input);

                throw nvae;
            }
            switch (alt61) {
                case 1 :
                    // InternalOCLinEcore.g:5370:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5370:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5371:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5372:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                    // InternalOCLinEcore.g:5372: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:5376:6: ( rulePrimaryExpCS )
                    {
                    // InternalOCLinEcore.g:5376:6: ( rulePrimaryExpCS )
                    // InternalOCLinEcore.g:5377: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:5387: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:5391:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
            int alt62=10;
            alt62 = dfa62.predict(input);
            switch (alt62) {
                case 1 :
                    // InternalOCLinEcore.g:5392:1: ( ruleNestedExpCS )
                    {
                    // InternalOCLinEcore.g:5392:1: ( ruleNestedExpCS )
                    // InternalOCLinEcore.g:5393: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:5398:6: ( ruleIfExpCS )
                    {
                    // InternalOCLinEcore.g:5398:6: ( ruleIfExpCS )
                    // InternalOCLinEcore.g:5399: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:5404:6: ( ruleSelfExpCS )
                    {
                    // InternalOCLinEcore.g:5404:6: ( ruleSelfExpCS )
                    // InternalOCLinEcore.g:5405: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:5410:6: ( rulePrimitiveLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5410:6: ( rulePrimitiveLiteralExpCS )
                    // InternalOCLinEcore.g:5411: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:5416:6: ( ruleTupleLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5416:6: ( ruleTupleLiteralExpCS )
                    // InternalOCLinEcore.g:5417: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:5422:6: ( ruleMapLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5422:6: ( ruleMapLiteralExpCS )
                    // InternalOCLinEcore.g:5423: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:5428:6: ( ruleCollectionLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5428:6: ( ruleCollectionLiteralExpCS )
                    // InternalOCLinEcore.g:5429: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:5434:6: ( ruleLambdaLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5434:6: ( ruleLambdaLiteralExpCS )
                    // InternalOCLinEcore.g:5435: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:5440:6: ( ruleTypeLiteralExpCS )
                    {
                    // InternalOCLinEcore.g:5440:6: ( ruleTypeLiteralExpCS )
                    // InternalOCLinEcore.g:5441: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:5446:6: ( ruleNameExpCS )
                    {
                    // InternalOCLinEcore.g:5446:6: ( ruleNameExpCS )
                    // InternalOCLinEcore.g:5447: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__CurlyBracketedClauseCS__Alternatives_2"
    // InternalOCLinEcore.g:5457:1: rule__CurlyBracketedClauseCS__Alternatives_2 : ( ( ( rule__CurlyBracketedClauseCS__Group_2_0__0 )? ) | ( ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 ) ) );
    public final void rule__CurlyBracketedClauseCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5461:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_0__0 )? ) | ( ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 ) ) )
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( ((LA64_0>=RULE_SIMPLE_ID && LA64_0<=RULE_ESCAPED_ID)||(LA64_0>=17 && LA64_0<=51)||(LA64_0>=54 && LA64_0<=59)||LA64_0==101) ) {
                alt64=1;
            }
            else if ( (LA64_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt64=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 64, 0, input);

                throw nvae;
            }
            switch (alt64) {
                case 1 :
                    // InternalOCLinEcore.g:5462:1: ( ( rule__CurlyBracketedClauseCS__Group_2_0__0 )? )
                    {
                    // InternalOCLinEcore.g:5462:1: ( ( rule__CurlyBracketedClauseCS__Group_2_0__0 )? )
                    // InternalOCLinEcore.g:5463:1: ( rule__CurlyBracketedClauseCS__Group_2_0__0 )?
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:5464:1: ( rule__CurlyBracketedClauseCS__Group_2_0__0 )?
                    int alt63=2;
                    int LA63_0 = input.LA(1);

                    if ( ((LA63_0>=RULE_SIMPLE_ID && LA63_0<=RULE_ESCAPED_ID)||(LA63_0>=17 && LA63_0<=51)||(LA63_0>=54 && LA63_0<=59)) ) {
                        alt63=1;
                    }
                    switch (alt63) {
                        case 1 :
                            // InternalOCLinEcore.g:5464:2: rule__CurlyBracketedClauseCS__Group_2_0__0
                            {
                            pushFollow(FollowSets000.FOLLOW_2);
                            rule__CurlyBracketedClauseCS__Group_2_0__0();

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

                            }
                            break;

                    }

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

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5468:6: ( ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 ) )
                    {
                    // InternalOCLinEcore.g:5468:6: ( ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 ) )
                    // InternalOCLinEcore.g:5469:1: ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getCurlyBracketedClauseCSAccess().getValueAssignment_2_1());
                    }
                    // InternalOCLinEcore.g:5470:1: ( rule__CurlyBracketedClauseCS__ValueAssignment_2_1 )
                    // InternalOCLinEcore.g:5470:2: rule__CurlyBracketedClauseCS__ValueAssignment_2_1
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__CurlyBracketedClauseCS__ValueAssignment_2_1();

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

                    }

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

                    }


                    }
                    break;

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__NavigatingArgCS__Alternatives"
    // InternalOCLinEcore.g:5479: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:5483:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
            int alt65=2;
            int LA65_0 = input.LA(1);

            if ( ((LA65_0>=RULE_INT && LA65_0<=RULE_SINGLE_QUOTED_STRING)||(LA65_0>=RULE_SIMPLE_ID && LA65_0<=RULE_ESCAPED_ID)||(LA65_0>=17 && LA65_0<=51)||(LA65_0>=54 && LA65_0<=62)||(LA65_0>=79 && LA65_0<=93)||LA65_0==96||LA65_0==106||(LA65_0>=108 && LA65_0<=109)||LA65_0==114||(LA65_0>=119 && LA65_0<=120)||(LA65_0>=133 && LA65_0<=134)) ) {
                alt65=1;
            }
            else if ( (LA65_0==98) ) {
                alt65=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;
            }
            switch (alt65) {
                case 1 :
                    // InternalOCLinEcore.g:5484:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5484:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                    // InternalOCLinEcore.g:5485:1: ( rule__NavigatingArgCS__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                    }
                    // InternalOCLinEcore.g:5486:1: ( rule__NavigatingArgCS__Group_0__0 )
                    // InternalOCLinEcore.g:5486: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:5490:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5490:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                    // InternalOCLinEcore.g:5491:1: ( rule__NavigatingArgCS__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                    }
                    // InternalOCLinEcore.g:5492:1: ( rule__NavigatingArgCS__Group_1__0 )
                    // InternalOCLinEcore.g:5492: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:5501:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) );
    public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5505:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( (LA66_0==98) ) {
                alt66=1;
            }
            else if ( (LA66_0==113) ) {
                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:5506:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5506:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                    // InternalOCLinEcore.g:5507:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                    }
                    // InternalOCLinEcore.g:5508:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                    // InternalOCLinEcore.g:5508: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:5512:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5512:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                    // InternalOCLinEcore.g:5513:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                    }
                    // InternalOCLinEcore.g:5514:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                    // InternalOCLinEcore.g:5514: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;

            }
        }
        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:5523:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) );
    public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5527:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
            int alt67=2;
            int LA67_0 = input.LA(1);

            if ( (LA67_0==98) ) {
                alt67=1;
            }
            else if ( (LA67_0==113) ) {
                alt67=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 67, 0, input);

                throw nvae;
            }
            switch (alt67) {
                case 1 :
                    // InternalOCLinEcore.g:5528:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                    {
                    // InternalOCLinEcore.g:5528:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                    // InternalOCLinEcore.g:5529:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                    }
                    // InternalOCLinEcore.g:5530:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                    // InternalOCLinEcore.g:5530: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:5534:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                    {
                    // InternalOCLinEcore.g:5534:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                    // InternalOCLinEcore.g:5535:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                    }
                    // InternalOCLinEcore.g:5536:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                    // InternalOCLinEcore.g:5536: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;

            }
        }
        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:5545:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
    public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5549:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
            int alt68=2;
            alt68 = dfa68.predict(input);
            switch (alt68) {
                case 1 :
                    // InternalOCLinEcore.g:5550:1: ( ruleExpCS )
                    {
                    // InternalOCLinEcore.g:5550:1: ( ruleExpCS )
                    // InternalOCLinEcore.g:5551: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:5556:6: ( rulePatternExpCS )
                    {
                    // InternalOCLinEcore.g:5556:6: ( rulePatternExpCS )
                    // InternalOCLinEcore.g:5557: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:5567:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
    public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5571:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
            int alt69=2;
            int LA69_0 = input.LA(1);

            if ( (LA69_0==RULE_INT) ) {
                alt69=1;
            }
            else if ( (LA69_0==62||LA69_0==64||LA69_0==95) ) {
                alt69=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 69, 0, input);

                throw nvae;
            }
            switch (alt69) {
                case 1 :
                    // InternalOCLinEcore.g:5572:1: ( ruleMultiplicityBoundsCS )
                    {
                    // InternalOCLinEcore.g:5572:1: ( ruleMultiplicityBoundsCS )
                    // InternalOCLinEcore.g:5573: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:5578:6: ( ruleMultiplicityStringCS )
                    {
                    // InternalOCLinEcore.g:5578:6: ( ruleMultiplicityStringCS )
                    // InternalOCLinEcore.g:5579: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:5589: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:5593:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
            int alt70=2;
            int LA70_0 = input.LA(1);

            if ( (LA70_0==94) ) {
                alt70=1;
            }
            else if ( (LA70_0==137) ) {
                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:5594:1: ( '|?' )
                    {
                    // InternalOCLinEcore.g:5594:1: ( '|?' )
                    // InternalOCLinEcore.g:5595:1: '|?'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
                    }
                    match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5602:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                    {
                    // InternalOCLinEcore.g:5602:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                    // InternalOCLinEcore.g:5603:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                    }
                    // InternalOCLinEcore.g:5604:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                    // InternalOCLinEcore.g:5604: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:5613:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
    public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5617:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
            int alt71=3;
            switch ( input.LA(1) ) {
            case 62:
                {
                alt71=1;
                }
                break;
            case 64:
                {
                alt71=2;
                }
                break;
            case 95:
                {
                alt71=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 71, 0, input);

                throw nvae;
            }

            switch (alt71) {
                case 1 :
                    // InternalOCLinEcore.g:5618:1: ( '*' )
                    {
                    // InternalOCLinEcore.g:5618:1: ( '*' )
                    // InternalOCLinEcore.g:5619:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
                    }
                    match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalOCLinEcore.g:5626:6: ( '+' )
                    {
                    // InternalOCLinEcore.g:5626:6: ( '+' )
                    // InternalOCLinEcore.g:5627:1: '+'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
                    }
                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalOCLinEcore.g:5634:6: ( '?' )
                    {
                    // InternalOCLinEcore.g:5634:6: ( '?' )
                    // InternalOCLinEcore.g:5635:1: '?'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
                    }
                    match(input,95,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:5647:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
    public final void rule__TypeRefCS__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5651:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
            int alt72=2;
            int LA72_0 = input.LA(1);

            if ( ((LA72_0>=RULE_SIMPLE_ID && LA72_0<=RULE_ESCAPED_ID)||(LA72_0>=17 && LA72_0<=51)||(LA72_0>=54 && LA72_0<=59)||(LA72_0>=79 && LA72_0<=93)) ) {
                alt72=1;
            }
            else if ( (LA72_0==95) ) {
                alt72=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 72, 0, input);

                throw nvae;
            }
            switch (alt72) {
                case 1 :
                    // InternalOCLinEcore.g:5652:1: ( ruleTypedRefCS )
                    {
                    // InternalOCLinEcore.g:5652:1: ( ruleTypedRefCS )
                    // InternalOCLinEcore.g:5653: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:5658:6: ( ruleWildcardTypeRefCS )
                    {
                    // InternalOCLinEcore.g:5658:6: ( ruleWildcardTypeRefCS )
                    // InternalOCLinEcore.g:5659: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:5669:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
    public final void rule__ID__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5673:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
            int alt73=2;
            int LA73_0 = input.LA(1);

            if ( (LA73_0==RULE_SIMPLE_ID) ) {
                alt73=1;
            }
            else if ( (LA73_0==RULE_ESCAPED_ID) ) {
                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:5674:1: ( RULE_SIMPLE_ID )
                    {
                    // InternalOCLinEcore.g:5674:1: ( RULE_SIMPLE_ID )
                    // InternalOCLinEcore.g:5675: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:5680:6: ( RULE_ESCAPED_ID )
                    {
                    // InternalOCLinEcore.g:5680:6: ( RULE_ESCAPED_ID )
                    // InternalOCLinEcore.g:5681: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:5691:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
    public final void rule__UPPER__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5695:1: ( ( RULE_INT ) | ( '*' ) )
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( (LA74_0==RULE_INT) ) {
                alt74=1;
            }
            else if ( (LA74_0==62) ) {
                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:5696:1: ( RULE_INT )
                    {
                    // InternalOCLinEcore.g:5696:1: ( RULE_INT )
                    // InternalOCLinEcore.g:5697: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:5702:6: ( '*' )
                    {
                    // InternalOCLinEcore.g:5702:6: ( '*' )
                    // InternalOCLinEcore.g:5703:1: '*'
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
                    }
                    match(input,62,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:5717: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:5721:1: ( rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 )
            // InternalOCLinEcore.g:5722: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:5729:1: rule__TopLevelCS__Group__0__Impl : ( () ) ;
    public final void rule__TopLevelCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5733:1: ( ( () ) )
            // InternalOCLinEcore.g:5734:1: ( () )
            {
            // InternalOCLinEcore.g:5734:1: ( () )
            // InternalOCLinEcore.g:5735:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getTopLevelCSAction_0());
            }
            // InternalOCLinEcore.g:5736:1: ()
            // InternalOCLinEcore.g:5738: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:5748: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:5752:1: ( rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 )
            // InternalOCLinEcore.g:5753: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:5760: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:5764:1: ( ( ( rule__TopLevelCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:5765:1: ( ( rule__TopLevelCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:5765:1: ( ( rule__TopLevelCS__Group_1__0 )? )
            // InternalOCLinEcore.g:5766:1: ( rule__TopLevelCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:5767:1: ( rule__TopLevelCS__Group_1__0 )?
            int alt75=2;
            int LA75_0 = input.LA(1);

            if ( (LA75_0==35) ) {
                alt75=1;
            }
            switch (alt75) {
                case 1 :
                    // InternalOCLinEcore.g:5767: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:5777: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:5781:1: ( rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 )
            // InternalOCLinEcore.g:5782: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:5789: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:5793:1: ( ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) )
            // InternalOCLinEcore.g:5794:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
            {
            // InternalOCLinEcore.g:5794:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
            // InternalOCLinEcore.g:5795:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedImportsAssignment_2());
            }
            // InternalOCLinEcore.g:5796:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
            loop76:
            do {
                int alt76=2;
                int LA76_0 = input.LA(1);

                if ( (LA76_0==30||LA76_0==34) ) {
                    alt76=1;
                }


                switch (alt76) {
            	case 1 :
            	    // InternalOCLinEcore.g:5796:2: rule__TopLevelCS__OwnedImportsAssignment_2
            	    {
            	    pushFollow(FollowSets000.FOLLOW_5);
            	    rule__TopLevelCS__OwnedImportsAssignment_2();

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

            	    }
            	    break;

            	default :
            	    break loop76;
                }
            } 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:5806: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:5810:1: ( rule__TopLevelCS__Group__3__Impl )
            // InternalOCLinEcore.g:5811: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:5817: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:5821:1: ( ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) )
            // InternalOCLinEcore.g:5822:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
            {
            // InternalOCLinEcore.g:5822:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
            // InternalOCLinEcore.g:5823:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTopLevelCSAccess().getOwnedPackagesAssignment_3());
            }
            // InternalOCLinEcore.g:5824:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
            loop77:
            do {
                int alt77=2;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==38) ) {
                    alt77=1;
                }


                switch (alt77) {
            	case 1 :
            	    // InternalOCLinEcore.g:5824:2: rule__TopLevelCS__OwnedPackagesAssignment_3
            	    {
            	    pushFollow(FollowSets000.FOLLOW_6);
            	    rule__TopLevelCS__OwnedPackagesAssignment_3();

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

            	    }
            	    break;

            	default :
            	    break loop77;
                }
            } 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:5842: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:5846:1: ( rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 )
            // InternalOCLinEcore.g:5847: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:5854: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:5858:1: ( ( 'module' ) )
            // InternalOCLinEcore.g:5859:1: ( 'module' )
            {
            // InternalOCLinEcore.g:5859:1: ( 'module' )
            // InternalOCLinEcore.g:5860: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:5873: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:5877:1: ( rule__TopLevelCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:5878: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:5884: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:5888:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:5889:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:5889:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:5890: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:5905: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:5909:1: ( rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 )
            // InternalOCLinEcore.g:5910: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:5917:1: rule__SIGNED__Group__0__Impl : ( ( '-' )? ) ;
    public final void rule__SIGNED__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5921:1: ( ( ( '-' )? ) )
            // InternalOCLinEcore.g:5922:1: ( ( '-' )? )
            {
            // InternalOCLinEcore.g:5922:1: ( ( '-' )? )
            // InternalOCLinEcore.g:5923:1: ( '-' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());
            }
            // InternalOCLinEcore.g:5924:1: ( '-' )?
            int alt78=2;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==60) ) {
                alt78=1;
            }
            switch (alt78) {
                case 1 :
                    // InternalOCLinEcore.g:5925:2: '-'
                    {
                    match(input,60,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:5936: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:5940:1: ( rule__SIGNED__Group__1__Impl )
            // InternalOCLinEcore.g:5941: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:5947:1: rule__SIGNED__Group__1__Impl : ( RULE_INT ) ;
    public final void rule__SIGNED__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:5951:1: ( ( RULE_INT ) )
            // InternalOCLinEcore.g:5952:1: ( RULE_INT )
            {
            // InternalOCLinEcore.g:5952:1: ( RULE_INT )
            // InternalOCLinEcore.g:5953: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:5968: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:5972:1: ( rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 )
            // InternalOCLinEcore.g:5973: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:5980: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:5984:1: ( ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) )
            // InternalOCLinEcore.g:5985:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
            {
            // InternalOCLinEcore.g:5985:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
            // InternalOCLinEcore.g:5986:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableAssignment_0());
            }
            // InternalOCLinEcore.g:5987:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
            int alt79=2;
            int LA79_0 = input.LA(1);

            if ( (LA79_0==20) ) {
                alt79=1;
            }
            switch (alt79) {
                case 1 :
                    // InternalOCLinEcore.g:5987: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:5997: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:6001:1: ( rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6002: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:6009: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:6013:1: ( ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) )
            // InternalOCLinEcore.g:6014:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
            {
            // InternalOCLinEcore.g:6014:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
            // InternalOCLinEcore.g:6015:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeAssignment_1());
            }
            // InternalOCLinEcore.g:6016:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
            // InternalOCLinEcore.g:6016: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:6026: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:6030:1: ( rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6031: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:6038: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:6042:1: ( ( ( rule__InvariantConstraintCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:6043:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:6043:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
            // InternalOCLinEcore.g:6044:1: ( rule__InvariantConstraintCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:6045:1: ( rule__InvariantConstraintCS__Group_2__0 )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( ((LA80_0>=RULE_SIMPLE_ID && LA80_0<=RULE_ESCAPED_ID)||(LA80_0>=17 && LA80_0<=51)||(LA80_0>=54 && LA80_0<=59)) ) {
                alt80=1;
            }
            switch (alt80) {
                case 1 :
                    // InternalOCLinEcore.g:6045: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:6055: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:6059:1: ( rule__InvariantConstraintCS__Group__3__Impl )
            // InternalOCLinEcore.g:6060: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:6066: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:6070:1: ( ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) )
            // InternalOCLinEcore.g:6071:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
            {
            // InternalOCLinEcore.g:6071:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
            // InternalOCLinEcore.g:6072:1: ( rule__InvariantConstraintCS__Alternatives_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getAlternatives_3());
            }
            // InternalOCLinEcore.g:6073:1: ( rule__InvariantConstraintCS__Alternatives_3 )
            // InternalOCLinEcore.g:6073: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:6091: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:6095:1: ( rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 )
            // InternalOCLinEcore.g:6096: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:6103: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:6107:1: ( ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:6108:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:6108:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
            // InternalOCLinEcore.g:6109:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getNameAssignment_2_0());
            }
            // InternalOCLinEcore.g:6110:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
            // InternalOCLinEcore.g:6110: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:6120: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:6124:1: ( rule__InvariantConstraintCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:6125: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:6131: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:6135:1: ( ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) )
            // InternalOCLinEcore.g:6136:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
            {
            // InternalOCLinEcore.g:6136:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
            // InternalOCLinEcore.g:6137:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:6138:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
            int alt81=2;
            int LA81_0 = input.LA(1);

            if ( (LA81_0==96) ) {
                alt81=1;
            }
            switch (alt81) {
                case 1 :
                    // InternalOCLinEcore.g:6138: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:6152: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:6156:1: ( rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 )
            // InternalOCLinEcore.g:6157: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:6164: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:6168:1: ( ( '(' ) )
            // InternalOCLinEcore.g:6169:1: ( '(' )
            {
            // InternalOCLinEcore.g:6169:1: ( '(' )
            // InternalOCLinEcore.g:6170:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getLeftParenthesisKeyword_2_1_0());
            }
            match(input,96,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:6183: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:6187:1: ( rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 )
            // InternalOCLinEcore.g:6188: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:6195: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:6199:1: ( ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:6200:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:6200:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:6201:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:6202:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
            // InternalOCLinEcore.g:6202: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:6212: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:6216:1: ( rule__InvariantConstraintCS__Group_2_1__2__Impl )
            // InternalOCLinEcore.g:6217: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:6223: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:6227:1: ( ( ')' ) )
            // InternalOCLinEcore.g:6228:1: ( ')' )
            {
            // InternalOCLinEcore.g:6228:1: ( ')' )
            // InternalOCLinEcore.g:6229:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getRightParenthesisKeyword_2_1_2());
            }
            match(input,97,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:6248: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:6252:1: ( rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 )
            // InternalOCLinEcore.g:6253: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:6260: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:6264:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6265:1: ( ':' )
            {
            // InternalOCLinEcore.g:6265:1: ( ':' )
            // InternalOCLinEcore.g:6266:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getColonKeyword_3_0_0());
            }
            match(input,98,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:6279: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:6283:1: ( rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 )
            // InternalOCLinEcore.g:6284: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:6291: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:6295:1: ( ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) )
            // InternalOCLinEcore.g:6296:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
            {
            // InternalOCLinEcore.g:6296:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
            // InternalOCLinEcore.g:6297:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationAssignment_3_0_1());
            }
            // InternalOCLinEcore.g:6298:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
            int alt82=2;
            int LA82_0 = input.LA(1);

            if ( ((LA82_0>=RULE_INT && LA82_0<=RULE_SINGLE_QUOTED_STRING)||(LA82_0>=RULE_SIMPLE_ID && LA82_0<=RULE_UNQUOTED_STRING)||(LA82_0>=17 && LA82_0<=51)||(LA82_0>=54 && LA82_0<=62)||(LA82_0>=79 && LA82_0<=93)||LA82_0==96||LA82_0==106||(LA82_0>=108 && LA82_0<=109)||LA82_0==114||(LA82_0>=119 && LA82_0<=120)||(LA82_0>=133 && LA82_0<=134)) ) {
                alt82=1;
            }
            switch (alt82) {
                case 1 :
                    // InternalOCLinEcore.g:6298: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:6308: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:6312:1: ( rule__InvariantConstraintCS__Group_3_0__2__Impl )
            // InternalOCLinEcore.g:6313: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:6319: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:6323:1: ( ( ';' ) )
            // InternalOCLinEcore.g:6324:1: ( ';' )
            {
            // InternalOCLinEcore.g:6324:1: ( ';' )
            // InternalOCLinEcore.g:6325: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:6344: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:6348:1: ( rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 )
            // InternalOCLinEcore.g:6349: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:6356: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:6360:1: ( ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:6361:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:6361:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
            // InternalOCLinEcore.g:6362:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypeAssignment_0());
            }
            // InternalOCLinEcore.g:6363:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
            // InternalOCLinEcore.g:6363: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:6373: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:6377:1: ( rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6378: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:6385: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:6389:1: ( ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:6390:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:6390:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
            // InternalOCLinEcore.g:6391:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:6392:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( ((LA83_0>=RULE_SIMPLE_ID && LA83_0<=RULE_ESCAPED_ID)||(LA83_0>=17 && LA83_0<=51)||(LA83_0>=54 && LA83_0<=59)) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalOCLinEcore.g:6392: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:6402: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:6406:1: ( rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6407: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:6414:1: rule__PostconditionConstraintCS__Group__2__Impl : ( ':' ) ;
    public final void rule__PostconditionConstraintCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6418:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6419:1: ( ':' )
            {
            // InternalOCLinEcore.g:6419:1: ( ':' )
            // InternalOCLinEcore.g:6420:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getColonKeyword_2());
            }
            match(input,98,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:6433: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:6437:1: ( rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 )
            // InternalOCLinEcore.g:6438: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:6445: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:6449:1: ( ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
            // InternalOCLinEcore.g:6450:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            {
            // InternalOCLinEcore.g:6450:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            // InternalOCLinEcore.g:6451:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }
            // InternalOCLinEcore.g:6452:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( ((LA84_0>=RULE_INT && LA84_0<=RULE_SINGLE_QUOTED_STRING)||(LA84_0>=RULE_SIMPLE_ID && LA84_0<=RULE_UNQUOTED_STRING)||(LA84_0>=17 && LA84_0<=51)||(LA84_0>=54 && LA84_0<=62)||(LA84_0>=79 && LA84_0<=93)||LA84_0==96||LA84_0==106||(LA84_0>=108 && LA84_0<=109)||LA84_0==114||(LA84_0>=119 && LA84_0<=120)||(LA84_0>=133 && LA84_0<=134)) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // InternalOCLinEcore.g:6452: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:6462: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:6466:1: ( rule__PostconditionConstraintCS__Group__4__Impl )
            // InternalOCLinEcore.g:6467: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:6473:1: rule__PostconditionConstraintCS__Group__4__Impl : ( ';' ) ;
    public final void rule__PostconditionConstraintCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6477:1: ( ( ';' ) )
            // InternalOCLinEcore.g:6478:1: ( ';' )
            {
            // InternalOCLinEcore.g:6478:1: ( ';' )
            // InternalOCLinEcore.g:6479: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:6502: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:6506:1: ( rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 )
            // InternalOCLinEcore.g:6507: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:6514: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:6518:1: ( ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:6519:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:6519:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:6520:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:6521:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:6521: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:6531: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:6535:1: ( rule__PostconditionConstraintCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:6536: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:6542: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:6546:1: ( ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:6547:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:6547:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:6548:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:6549:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
            int alt85=2;
            int LA85_0 = input.LA(1);

            if ( (LA85_0==96) ) {
                alt85=1;
            }
            switch (alt85) {
                case 1 :
                    // InternalOCLinEcore.g:6549: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:6563: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:6567:1: ( rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 )
            // InternalOCLinEcore.g:6568: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:6575: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:6579:1: ( ( '(' ) )
            // InternalOCLinEcore.g:6580:1: ( '(' )
            {
            // InternalOCLinEcore.g:6580:1: ( '(' )
            // InternalOCLinEcore.g:6581:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }
            match(input,96,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:6594: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:6598:1: ( rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 )
            // InternalOCLinEcore.g:6599: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:6606: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:6610:1: ( ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:6611:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:6611:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:6612:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:6613:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            // InternalOCLinEcore.g:6613: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:6623: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:6627:1: ( rule__PostconditionConstraintCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:6628: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:6634: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:6638:1: ( ( ')' ) )
            // InternalOCLinEcore.g:6639:1: ( ')' )
            {
            // InternalOCLinEcore.g:6639:1: ( ')' )
            // InternalOCLinEcore.g:6640:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }
            match(input,97,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:6659: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:6663:1: ( rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 )
            // InternalOCLinEcore.g:6664: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:6671: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:6675:1: ( ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:6676:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:6676:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
            // InternalOCLinEcore.g:6677:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypeAssignment_0());
            }
            // InternalOCLinEcore.g:6678:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
            // InternalOCLinEcore.g:6678: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:6688: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:6692:1: ( rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 )
            // InternalOCLinEcore.g:6693: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:6700: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:6704:1: ( ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:6705:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:6705:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
            // InternalOCLinEcore.g:6706:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:6707:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
            int alt86=2;
            int LA86_0 = input.LA(1);

            if ( ((LA86_0>=RULE_SIMPLE_ID && LA86_0<=RULE_ESCAPED_ID)||(LA86_0>=17 && LA86_0<=51)||(LA86_0>=54 && LA86_0<=59)) ) {
                alt86=1;
            }
            switch (alt86) {
                case 1 :
                    // InternalOCLinEcore.g:6707: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:6717: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:6721:1: ( rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 )
            // InternalOCLinEcore.g:6722: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:6729:1: rule__PreconditionConstraintCS__Group__2__Impl : ( ':' ) ;
    public final void rule__PreconditionConstraintCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6733:1: ( ( ':' ) )
            // InternalOCLinEcore.g:6734:1: ( ':' )
            {
            // InternalOCLinEcore.g:6734:1: ( ':' )
            // InternalOCLinEcore.g:6735:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getColonKeyword_2());
            }
            match(input,98,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:6748: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:6752:1: ( rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 )
            // InternalOCLinEcore.g:6753: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:6760: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:6764:1: ( ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
            // InternalOCLinEcore.g:6765:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            {
            // InternalOCLinEcore.g:6765:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
            // InternalOCLinEcore.g:6766:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
            }
            // InternalOCLinEcore.g:6767:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
            int alt87=2;
            int LA87_0 = input.LA(1);

            if ( ((LA87_0>=RULE_INT && LA87_0<=RULE_SINGLE_QUOTED_STRING)||(LA87_0>=RULE_SIMPLE_ID && LA87_0<=RULE_UNQUOTED_STRING)||(LA87_0>=17 && LA87_0<=51)||(LA87_0>=54 && LA87_0<=62)||(LA87_0>=79 && LA87_0<=93)||LA87_0==96||LA87_0==106||(LA87_0>=108 && LA87_0<=109)||LA87_0==114||(LA87_0>=119 && LA87_0<=120)||(LA87_0>=133 && LA87_0<=134)) ) {
                alt87=1;
            }
            switch (alt87) {
                case 1 :
                    // InternalOCLinEcore.g:6767: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:6777: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:6781:1: ( rule__PreconditionConstraintCS__Group__4__Impl )
            // InternalOCLinEcore.g:6782: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:6788:1: rule__PreconditionConstraintCS__Group__4__Impl : ( ';' ) ;
    public final void rule__PreconditionConstraintCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6792:1: ( ( ';' ) )
            // InternalOCLinEcore.g:6793:1: ( ';' )
            {
            // InternalOCLinEcore.g:6793:1: ( ';' )
            // InternalOCLinEcore.g:6794: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:6817: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:6821:1: ( rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 )
            // InternalOCLinEcore.g:6822: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:6829: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:6833:1: ( ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:6834:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:6834:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:6835:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:6836:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:6836: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:6846: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:6850:1: ( rule__PreconditionConstraintCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:6851: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:6857: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:6861:1: ( ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:6862:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:6862:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:6863:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:6864:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==96) ) {
                alt88=1;
            }
            switch (alt88) {
                case 1 :
                    // InternalOCLinEcore.g:6864: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:6878: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:6882:1: ( rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 )
            // InternalOCLinEcore.g:6883: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:6890: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:6894:1: ( ( '(' ) )
            // InternalOCLinEcore.g:6895:1: ( '(' )
            {
            // InternalOCLinEcore.g:6895:1: ( '(' )
            // InternalOCLinEcore.g:6896:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
            }
            match(input,96,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:6909: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:6913:1: ( rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 )
            // InternalOCLinEcore.g:6914: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:6921: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:6925:1: ( ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:6926:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:6926:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:6927:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:6928:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
            // InternalOCLinEcore.g:6928: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:6938: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:6942:1: ( rule__PreconditionConstraintCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:6943: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:6949: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:6953:1: ( ( ')' ) )
            // InternalOCLinEcore.g:6954:1: ( ')' )
            {
            // InternalOCLinEcore.g:6954:1: ( ')' )
            // InternalOCLinEcore.g:6955:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
            }
            match(input,97,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:6974: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:6978:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
            // InternalOCLinEcore.g:6979: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:6986:1: rule__AnnotationCS__Group__0__Impl : ( () ) ;
    public final void rule__AnnotationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:6990:1: ( ( () ) )
            // InternalOCLinEcore.g:6991:1: ( () )
            {
            // InternalOCLinEcore.g:6991:1: ( () )
            // InternalOCLinEcore.g:6992:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAnnotationCSAction_0());
            }
            // InternalOCLinEcore.g:6993:1: ()
            // InternalOCLinEcore.g:6995: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:7005: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:7009:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
            // InternalOCLinEcore.g:7010: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:7017:1: rule__AnnotationCS__Group__1__Impl : ( 'annotation' ) ;
    public final void rule__AnnotationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7021:1: ( ( 'annotation' ) )
            // InternalOCLinEcore.g:7022:1: ( 'annotation' )
            {
            // InternalOCLinEcore.g:7022:1: ( 'annotation' )
            // InternalOCLinEcore.g:7023: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:7036: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:7040:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
            // InternalOCLinEcore.g:7041: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:7048: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:7052:1: ( ( ( rule__AnnotationCS__NameAssignment_2 )? ) )
            // InternalOCLinEcore.g:7053:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
            {
            // InternalOCLinEcore.g:7053:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
            // InternalOCLinEcore.g:7054:1: ( rule__AnnotationCS__NameAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:7055:1: ( rule__AnnotationCS__NameAssignment_2 )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==RULE_SINGLE_QUOTED_STRING||(LA89_0>=RULE_SIMPLE_ID && LA89_0<=RULE_ESCAPED_ID)||(LA89_0>=17 && LA89_0<=51)||(LA89_0>=54 && LA89_0<=59)) ) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // InternalOCLinEcore.g:7055: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:7065: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:7069:1: ( rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 )
            // InternalOCLinEcore.g:7070: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:7077: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:7081:1: ( ( ( rule__AnnotationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:7082:1: ( ( rule__AnnotationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:7082:1: ( ( rule__AnnotationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:7083:1: ( rule__AnnotationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:7084:1: ( rule__AnnotationCS__Group_3__0 )?
            int alt90=2;
            int LA90_0 = input.LA(1);

            if ( (LA90_0==96) ) {
                alt90=1;
            }
            switch (alt90) {
                case 1 :
                    // InternalOCLinEcore.g:7084: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:7094: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:7098:1: ( rule__AnnotationCS__Group__4__Impl )
            // InternalOCLinEcore.g:7099: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:7105: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:7109:1: ( ( ( rule__AnnotationCS__Alternatives_4 ) ) )
            // InternalOCLinEcore.g:7110:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
            {
            // InternalOCLinEcore.g:7110:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
            // InternalOCLinEcore.g:7111:1: ( rule__AnnotationCS__Alternatives_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4());
            }
            // InternalOCLinEcore.g:7112:1: ( rule__AnnotationCS__Alternatives_4 )
            // InternalOCLinEcore.g:7112: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:7132: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:7136:1: ( rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 )
            // InternalOCLinEcore.g:7137: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:7144:1: rule__AnnotationCS__Group_3__0__Impl : ( '(' ) ;
    public final void rule__AnnotationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7148:1: ( ( '(' ) )
            // InternalOCLinEcore.g:7149:1: ( '(' )
            {
            // InternalOCLinEcore.g:7149:1: ( '(' )
            // InternalOCLinEcore.g:7150:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_3_0());
            }
            match(input,96,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:7163: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:7167:1: ( rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 )
            // InternalOCLinEcore.g:7168: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:7175: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:7179:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:7180:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:7180:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
            // InternalOCLinEcore.g:7181:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_1());
            }
            // InternalOCLinEcore.g:7182:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
            // InternalOCLinEcore.g:7182: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:7192: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:7196:1: ( rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 )
            // InternalOCLinEcore.g:7197: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:7204: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:7208:1: ( ( ( rule__AnnotationCS__Group_3_2__0 )* ) )
            // InternalOCLinEcore.g:7209:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
            {
            // InternalOCLinEcore.g:7209:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
            // InternalOCLinEcore.g:7210:1: ( rule__AnnotationCS__Group_3_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getGroup_3_2());
            }
            // InternalOCLinEcore.g:7211:1: ( rule__AnnotationCS__Group_3_2__0 )*
            loop91:
            do {
                int alt91=2;
                int LA91_0 = input.LA(1);

                if ( (LA91_0==99) ) {
                    alt91=1;
                }


                switch (alt91) {
            	case 1 :
            	    // InternalOCLinEcore.g:7211: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 loop91;
                }
            } 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:7221: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:7225:1: ( rule__AnnotationCS__Group_3__3__Impl )
            // InternalOCLinEcore.g:7226: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:7232:1: rule__AnnotationCS__Group_3__3__Impl : ( ')' ) ;
    public final void rule__AnnotationCS__Group_3__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7236:1: ( ( ')' ) )
            // InternalOCLinEcore.g:7237:1: ( ')' )
            {
            // InternalOCLinEcore.g:7237:1: ( ')' )
            // InternalOCLinEcore.g:7238:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_3_3());
            }
            match(input,97,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:7259: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:7263:1: ( rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 )
            // InternalOCLinEcore.g:7264: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:7271: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:7275:1: ( ( ',' ) )
            // InternalOCLinEcore.g:7276:1: ( ',' )
            {
            // InternalOCLinEcore.g:7276:1: ( ',' )
            // InternalOCLinEcore.g:7277:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getCommaKeyword_3_2_0());
            }
            match(input,99,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:7290: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:7294:1: ( rule__AnnotationCS__Group_3_2__1__Impl )
            // InternalOCLinEcore.g:7295: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:7301: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:7305:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) )
            // InternalOCLinEcore.g:7306:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
            {
            // InternalOCLinEcore.g:7306:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
            // InternalOCLinEcore.g:7307:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }
            // InternalOCLinEcore.g:7308:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
            // InternalOCLinEcore.g:7308: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:7322: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:7326:1: ( rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 )
            // InternalOCLinEcore.g:7327: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:7334: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:7338:1: ( ( '{' ) )
            // InternalOCLinEcore.g:7339:1: ( '{' )
            {
            // InternalOCLinEcore.g:7339:1: ( '{' )
            // InternalOCLinEcore.g:7340:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }
            match(input,100,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:7353: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:7357:1: ( rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 )
            // InternalOCLinEcore.g:7358: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:7365: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:7369:1: ( ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) )
            // InternalOCLinEcore.g:7370:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
            {
            // InternalOCLinEcore.g:7370:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
            // InternalOCLinEcore.g:7371:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
            {
            // InternalOCLinEcore.g:7371:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) )
            // InternalOCLinEcore.g:7372:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:7373:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
            // InternalOCLinEcore.g:7373: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:7376:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
            // InternalOCLinEcore.g:7377:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:7378:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
            loop92:
            do {
                int alt92=2;
                int LA92_0 = input.LA(1);

                if ( ((LA92_0>=RULE_SIMPLE_ID && LA92_0<=RULE_ESCAPED_ID)||(LA92_0>=17 && LA92_0<=51)||(LA92_0>=54 && LA92_0<=55)||LA92_0==57||LA92_0==59) ) {
                    alt92=1;
                }


                switch (alt92) {
            	case 1 :
            	    // InternalOCLinEcore.g:7378: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 loop92;
                }
            } 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:7389: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:7393:1: ( rule__AnnotationCS__Group_4_0__2__Impl )
            // InternalOCLinEcore.g:7394: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:7400: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:7404:1: ( ( '}' ) )
            // InternalOCLinEcore.g:7405:1: ( '}' )
            {
            // InternalOCLinEcore.g:7405:1: ( '}' )
            // InternalOCLinEcore.g:7406:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }
            match(input,101,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:7425: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:7429:1: ( rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 )
            // InternalOCLinEcore.g:7430: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:7437: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:7441:1: ( ( ( rule__AttributeCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:7442:1: ( ( rule__AttributeCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:7442:1: ( ( rule__AttributeCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:7443:1: ( rule__AttributeCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:7444:1: ( rule__AttributeCS__Alternatives_0 )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==24||LA93_0==46) ) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // InternalOCLinEcore.g:7444: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:7454: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:7458:1: ( rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 )
            // InternalOCLinEcore.g:7459: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:7466:1: rule__AttributeCS__Group__1__Impl : ( 'attribute' ) ;
    public final void rule__AttributeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7470:1: ( ( 'attribute' ) )
            // InternalOCLinEcore.g:7471:1: ( 'attribute' )
            {
            // InternalOCLinEcore.g:7471:1: ( 'attribute' )
            // InternalOCLinEcore.g:7472: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:7485: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:7489:1: ( rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 )
            // InternalOCLinEcore.g:7490: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:7497: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:7501:1: ( ( ( rule__AttributeCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:7502:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:7502:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:7503:1: ( rule__AttributeCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:7504:1: ( rule__AttributeCS__NameAssignment_2 )
            // InternalOCLinEcore.g:7504: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:7514: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:7518:1: ( rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 )
            // InternalOCLinEcore.g:7519: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:7526: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:7530:1: ( ( ( rule__AttributeCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:7531:1: ( ( rule__AttributeCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:7531:1: ( ( rule__AttributeCS__Group_3__0 )? )
            // InternalOCLinEcore.g:7532:1: ( rule__AttributeCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:7533:1: ( rule__AttributeCS__Group_3__0 )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==98) ) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // InternalOCLinEcore.g:7533: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:7543: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:7547:1: ( rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 )
            // InternalOCLinEcore.g:7548: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:7555: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:7559:1: ( ( ( rule__AttributeCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:7560:1: ( ( rule__AttributeCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:7560:1: ( ( rule__AttributeCS__Group_4__0 )? )
            // InternalOCLinEcore.g:7561:1: ( rule__AttributeCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:7562:1: ( rule__AttributeCS__Group_4__0 )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==69) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalOCLinEcore.g:7562: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:7572: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:7576:1: ( rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 )
            // InternalOCLinEcore.g:7577: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:7584: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:7588:1: ( ( ( rule__AttributeCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:7589:1: ( ( rule__AttributeCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:7589:1: ( ( rule__AttributeCS__Group_5__0 )? )
            // InternalOCLinEcore.g:7590:1: ( rule__AttributeCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:7591:1: ( rule__AttributeCS__Group_5__0 )?
            int alt96=2;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==100) ) {
                int LA96_1 = input.LA(2);

                if ( (LA96_1==26||LA96_1==29||LA96_1==37||LA96_1==43||(LA96_1>=48 && LA96_1<=51)||(LA96_1>=122 && LA96_1<=129)) ) {
                    alt96=1;
                }
            }
            switch (alt96) {
                case 1 :
                    // InternalOCLinEcore.g:7591: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:7601: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:7605:1: ( rule__AttributeCS__Group__6__Impl )
            // InternalOCLinEcore.g:7606: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:7612: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:7616:1: ( ( ( rule__AttributeCS__Alternatives_6 ) ) )
            // InternalOCLinEcore.g:7617:1: ( ( rule__AttributeCS__Alternatives_6 ) )
            {
            // InternalOCLinEcore.g:7617:1: ( ( rule__AttributeCS__Alternatives_6 ) )
            // InternalOCLinEcore.g:7618:1: ( rule__AttributeCS__Alternatives_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_6());
            }
            // InternalOCLinEcore.g:7619:1: ( rule__AttributeCS__Alternatives_6 )
            // InternalOCLinEcore.g:7619: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:7643: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:7647:1: ( rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 )
            // InternalOCLinEcore.g:7648: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:7655: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:7659:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:7660:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:7660:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:7661:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:7662:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:7662: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:7672: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:7676:1: ( rule__AttributeCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:7677: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:7683: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:7687:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:7688:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:7688:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:7689:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:7690:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==24) ) {
                alt97=1;
            }
            switch (alt97) {
                case 1 :
                    // InternalOCLinEcore.g:7690: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:7704: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:7708:1: ( rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 )
            // InternalOCLinEcore.g:7709: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:7716: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:7720:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:7721:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:7721:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:7722:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:7723:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:7723: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:7733: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:7737:1: ( rule__AttributeCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:7738: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:7744: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:7748:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:7749:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:7749:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:7750:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:7751:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==46) ) {
                alt98=1;
            }
            switch (alt98) {
                case 1 :
                    // InternalOCLinEcore.g:7751: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:7765: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:7769:1: ( rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 )
            // InternalOCLinEcore.g:7770: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:7777:1: rule__AttributeCS__Group_3__0__Impl : ( ':' ) ;
    public final void rule__AttributeCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7781:1: ( ( ':' ) )
            // InternalOCLinEcore.g:7782:1: ( ':' )
            {
            // InternalOCLinEcore.g:7782:1: ( ':' )
            // InternalOCLinEcore.g:7783:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());
            }
            match(input,98,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:7796: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:7800:1: ( rule__AttributeCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:7801: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:7807: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:7811:1: ( ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:7812:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:7812:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
            // InternalOCLinEcore.g:7813:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedTypeAssignment_3_1());
            }
            // InternalOCLinEcore.g:7814:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
            // InternalOCLinEcore.g:7814: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:7828: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:7832:1: ( rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 )
            // InternalOCLinEcore.g:7833: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:7840:1: rule__AttributeCS__Group_4__0__Impl : ( '=' ) ;
    public final void rule__AttributeCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7844:1: ( ( '=' ) )
            // InternalOCLinEcore.g:7845:1: ( '=' )
            {
            // InternalOCLinEcore.g:7845:1: ( '=' )
            // InternalOCLinEcore.g:7846:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());
            }
            match(input,69,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:7859: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:7863:1: ( rule__AttributeCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:7864: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:7870: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:7874:1: ( ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:7875:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:7875:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
            // InternalOCLinEcore.g:7876:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getDefaultAssignment_4_1());
            }
            // InternalOCLinEcore.g:7877:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
            // InternalOCLinEcore.g:7877: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:7891: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:7895:1: ( rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 )
            // InternalOCLinEcore.g:7896: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:7903:1: rule__AttributeCS__Group_5__0__Impl : ( '{' ) ;
    public final void rule__AttributeCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7907:1: ( ( '{' ) )
            // InternalOCLinEcore.g:7908:1: ( '{' )
            {
            // InternalOCLinEcore.g:7908:1: ( '{' )
            // InternalOCLinEcore.g:7909:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }
            match(input,100,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:7922: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:7926:1: ( rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 )
            // InternalOCLinEcore.g:7927: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:7934: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:7938:1: ( ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) )
            // InternalOCLinEcore.g:7939:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
            {
            // InternalOCLinEcore.g:7939:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
            // InternalOCLinEcore.g:7940:1: ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* )
            {
            // InternalOCLinEcore.g:7940:1: ( ( rule__AttributeCS__Group_5_1__0 ) )
            // InternalOCLinEcore.g:7941:1: ( rule__AttributeCS__Group_5_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:7942:1: ( rule__AttributeCS__Group_5_1__0 )
            // InternalOCLinEcore.g:7942: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:7945:1: ( ( rule__AttributeCS__Group_5_1__0 )* )
            // InternalOCLinEcore.g:7946:1: ( rule__AttributeCS__Group_5_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:7947:1: ( rule__AttributeCS__Group_5_1__0 )*
            loop99:
            do {
                int alt99=2;
                int LA99_0 = input.LA(1);

                if ( (LA99_0==26||LA99_0==29||LA99_0==37||LA99_0==43||(LA99_0>=48 && LA99_0<=51)||(LA99_0>=122 && LA99_0<=129)) ) {
                    alt99=1;
                }


                switch (alt99) {
            	case 1 :
            	    // InternalOCLinEcore.g:7947: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 loop99;
                }
            } 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:7958: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:7962:1: ( rule__AttributeCS__Group_5__2__Impl )
            // InternalOCLinEcore.g:7963: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:7969:1: rule__AttributeCS__Group_5__2__Impl : ( '}' ) ;
    public final void rule__AttributeCS__Group_5__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:7973:1: ( ( '}' ) )
            // InternalOCLinEcore.g:7974:1: ( '}' )
            {
            // InternalOCLinEcore.g:7974:1: ( '}' )
            // InternalOCLinEcore.g:7975:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());
            }
            match(input,101,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:7994: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:7998:1: ( rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 )
            // InternalOCLinEcore.g:7999: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:8006: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:8010:1: ( ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) )
            // InternalOCLinEcore.g:8011:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
            {
            // InternalOCLinEcore.g:8011:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
            // InternalOCLinEcore.g:8012:1: ( rule__AttributeCS__Alternatives_5_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_5_1_0());
            }
            // InternalOCLinEcore.g:8013:1: ( rule__AttributeCS__Alternatives_5_1_0 )
            // InternalOCLinEcore.g:8013: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:8023: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:8027:1: ( rule__AttributeCS__Group_5_1__1__Impl )
            // InternalOCLinEcore.g:8028: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:8034: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:8038:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:8039:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:8039:1: ( ( ',' )? )
            // InternalOCLinEcore.g:8040:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());
            }
            // InternalOCLinEcore.g:8041:1: ( ',' )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==99) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalOCLinEcore.g:8042:2: ','
                    {
                    match(input,99,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:8057: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:8061:1: ( rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 )
            // InternalOCLinEcore.g:8062: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:8069: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:8073:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8074:1: ( '{' )
            {
            // InternalOCLinEcore.g:8074:1: ( '{' )
            // InternalOCLinEcore.g:8075:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }
            match(input,100,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:8088: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:8092:1: ( rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 )
            // InternalOCLinEcore.g:8093: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:8100: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:8104:1: ( ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) )
            // InternalOCLinEcore.g:8105:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
            {
            // InternalOCLinEcore.g:8105:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
            // InternalOCLinEcore.g:8106:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getAlternatives_6_0_1());
            }
            // InternalOCLinEcore.g:8107:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
            loop101:
            do {
                int alt101=2;
                int LA101_0 = input.LA(1);

                if ( (LA101_0==25||LA101_0==31||(LA101_0>=54 && LA101_0<=55)||LA101_0==59) ) {
                    alt101=1;
                }


                switch (alt101) {
            	case 1 :
            	    // InternalOCLinEcore.g:8107: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 loop101;
                }
            } 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:8117: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:8121:1: ( rule__AttributeCS__Group_6_0__2__Impl )
            // InternalOCLinEcore.g:8122: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:8128: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:8132:1: ( ( '}' ) )
            // InternalOCLinEcore.g:8133:1: ( '}' )
            {
            // InternalOCLinEcore.g:8133:1: ( '}' )
            // InternalOCLinEcore.g:8134:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }
            match(input,101,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:8153: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:8157:1: ( rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 )
            // InternalOCLinEcore.g:8158: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:8165: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:8169:1: ( ( 'initial' ) )
            // InternalOCLinEcore.g:8170:1: ( 'initial' )
            {
            // InternalOCLinEcore.g:8170:1: ( 'initial' )
            // InternalOCLinEcore.g:8171: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:8184: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:8188:1: ( rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 )
            // InternalOCLinEcore.g:8189: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:8196: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:8200:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:8201:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:8201:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:8202:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());
            }
            // InternalOCLinEcore.g:8203:1: ( ruleUnrestrictedName )?
            int alt102=2;
            int LA102_0 = input.LA(1);

            if ( ((LA102_0>=RULE_SIMPLE_ID && LA102_0<=RULE_ESCAPED_ID)||(LA102_0>=17 && LA102_0<=51)||(LA102_0>=54 && LA102_0<=59)) ) {
                alt102=1;
            }
            switch (alt102) {
                case 1 :
                    // InternalOCLinEcore.g:8203: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:8213: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:8217:1: ( rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 )
            // InternalOCLinEcore.g:8218: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:8225: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:8229:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8230:1: ( ':' )
            {
            // InternalOCLinEcore.g:8230:1: ( ':' )
            // InternalOCLinEcore.g:8231:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());
            }
            match(input,98,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:8244: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:8248:1: ( rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 )
            // InternalOCLinEcore.g:8249: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:8256: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:8260:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) )
            // InternalOCLinEcore.g:8261:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
            {
            // InternalOCLinEcore.g:8261:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
            // InternalOCLinEcore.g:8262:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_1_3());
            }
            // InternalOCLinEcore.g:8263:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( ((LA103_0>=RULE_INT && LA103_0<=RULE_SINGLE_QUOTED_STRING)||(LA103_0>=RULE_SIMPLE_ID && LA103_0<=RULE_UNQUOTED_STRING)||(LA103_0>=17 && LA103_0<=51)||(LA103_0>=54 && LA103_0<=62)||(LA103_0>=79 && LA103_0<=93)||LA103_0==96||LA103_0==106||(LA103_0>=108 && LA103_0<=109)||LA103_0==114||(LA103_0>=119 && LA103_0<=120)||(LA103_0>=133 && LA103_0<=134)) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // InternalOCLinEcore.g:8263: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:8273: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:8277:1: ( rule__AttributeCS__Group_6_0_1_1__4__Impl )
            // InternalOCLinEcore.g:8278: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:8284: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:8288:1: ( ( ';' ) )
            // InternalOCLinEcore.g:8289:1: ( ';' )
            {
            // InternalOCLinEcore.g:8289:1: ( ';' )
            // InternalOCLinEcore.g:8290: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:8313: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:8317:1: ( rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 )
            // InternalOCLinEcore.g:8318: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:8325: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:8329:1: ( ( 'derivation' ) )
            // InternalOCLinEcore.g:8330:1: ( 'derivation' )
            {
            // InternalOCLinEcore.g:8330:1: ( 'derivation' )
            // InternalOCLinEcore.g:8331: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:8344: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:8348:1: ( rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 )
            // InternalOCLinEcore.g:8349: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:8356: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:8360:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:8361:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:8361:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:8362:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_2_1());
            }
            // InternalOCLinEcore.g:8363:1: ( ruleUnrestrictedName )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( ((LA104_0>=RULE_SIMPLE_ID && LA104_0<=RULE_ESCAPED_ID)||(LA104_0>=17 && LA104_0<=51)||(LA104_0>=54 && LA104_0<=59)) ) {
                alt104=1;
            }
            switch (alt104) {
                case 1 :
                    // InternalOCLinEcore.g:8363: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:8373: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:8377:1: ( rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 )
            // InternalOCLinEcore.g:8378: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:8385: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:8389:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8390:1: ( ':' )
            {
            // InternalOCLinEcore.g:8390:1: ( ':' )
            // InternalOCLinEcore.g:8391:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_2_2());
            }
            match(input,98,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:8404: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:8408:1: ( rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 )
            // InternalOCLinEcore.g:8409: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:8416: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:8420:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:8421:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:8421:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
            // InternalOCLinEcore.g:8422:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_2_3());
            }
            // InternalOCLinEcore.g:8423:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( ((LA105_0>=RULE_INT && LA105_0<=RULE_SINGLE_QUOTED_STRING)||(LA105_0>=RULE_SIMPLE_ID && LA105_0<=RULE_UNQUOTED_STRING)||(LA105_0>=17 && LA105_0<=51)||(LA105_0>=54 && LA105_0<=62)||(LA105_0>=79 && LA105_0<=93)||LA105_0==96||LA105_0==106||(LA105_0>=108 && LA105_0<=109)||LA105_0==114||(LA105_0>=119 && LA105_0<=120)||(LA105_0>=133 && LA105_0<=134)) ) {
                alt105=1;
            }
            switch (alt105) {
                case 1 :
                    // InternalOCLinEcore.g:8423: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:8433: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:8437:1: ( rule__AttributeCS__Group_6_0_1_2__4__Impl )
            // InternalOCLinEcore.g:8438: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:8444: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:8448:1: ( ( ';' ) )
            // InternalOCLinEcore.g:8449:1: ( ';' )
            {
            // InternalOCLinEcore.g:8449:1: ( ';' )
            // InternalOCLinEcore.g:8450: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:8473: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:8477:1: ( rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 )
            // InternalOCLinEcore.g:8478: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:8485: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:8489:1: ( ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) )
            // InternalOCLinEcore.g:8490:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
            {
            // InternalOCLinEcore.g:8490:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
            // InternalOCLinEcore.g:8491:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsPrimitiveAssignment_0());
            }
            // InternalOCLinEcore.g:8492:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( (LA106_0==41) ) {
                alt106=1;
            }
            switch (alt106) {
                case 1 :
                    // InternalOCLinEcore.g:8492: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:8502: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:8506:1: ( rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 )
            // InternalOCLinEcore.g:8507: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:8514:1: rule__DataTypeCS__Group__1__Impl : ( 'datatype' ) ;
    public final void rule__DataTypeCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8518:1: ( ( 'datatype' ) )
            // InternalOCLinEcore.g:8519:1: ( 'datatype' )
            {
            // InternalOCLinEcore.g:8519:1: ( 'datatype' )
            // InternalOCLinEcore.g:8520: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:8533: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:8537:1: ( rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 )
            // InternalOCLinEcore.g:8538: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:8545: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:8549:1: ( ( ( rule__DataTypeCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:8550:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:8550:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:8551:1: ( rule__DataTypeCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:8552:1: ( rule__DataTypeCS__NameAssignment_2 )
            // InternalOCLinEcore.g:8552: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:8562: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:8566:1: ( rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 )
            // InternalOCLinEcore.g:8567: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:8574: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:8578:1: ( ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) )
            // InternalOCLinEcore.g:8579:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
            {
            // InternalOCLinEcore.g:8579:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
            // InternalOCLinEcore.g:8580:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getOwnedSignatureAssignment_3());
            }
            // InternalOCLinEcore.g:8581:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==66||LA107_0==96) ) {
                alt107=1;
            }
            switch (alt107) {
                case 1 :
                    // InternalOCLinEcore.g:8581: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:8591: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:8595:1: ( rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 )
            // InternalOCLinEcore.g:8596: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:8603: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:8607:1: ( ( ( rule__DataTypeCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:8608:1: ( ( rule__DataTypeCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:8608:1: ( ( rule__DataTypeCS__Group_4__0 )? )
            // InternalOCLinEcore.g:8609:1: ( rule__DataTypeCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:8610:1: ( rule__DataTypeCS__Group_4__0 )?
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==98) ) {
                alt108=1;
            }
            switch (alt108) {
                case 1 :
                    // InternalOCLinEcore.g:8610: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:8620: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:8624:1: ( rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 )
            // InternalOCLinEcore.g:8625: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:8632: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:8636:1: ( ( ( rule__DataTypeCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:8637:1: ( ( rule__DataTypeCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:8637:1: ( ( rule__DataTypeCS__Group_5__0 )? )
            // InternalOCLinEcore.g:8638:1: ( rule__DataTypeCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:8639:1: ( rule__DataTypeCS__Group_5__0 )?
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==100) ) {
                int LA109_1 = input.LA(2);

                if ( (LA109_1==101) ) {
                    int LA109_3 = input.LA(3);

                    if ( (LA109_3==52||LA109_3==100) ) {
                        alt109=1;
                    }
                }
                else if ( (LA109_1==53||LA109_1==58) ) {
                    alt109=1;
                }
            }
            switch (alt109) {
                case 1 :
                    // InternalOCLinEcore.g:8639: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:8649: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:8653:1: ( rule__DataTypeCS__Group__6__Impl )
            // InternalOCLinEcore.g:8654: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:8660: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:8664:1: ( ( ( rule__DataTypeCS__Alternatives_6 ) ) )
            // InternalOCLinEcore.g:8665:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
            {
            // InternalOCLinEcore.g:8665:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
            // InternalOCLinEcore.g:8666:1: ( rule__DataTypeCS__Alternatives_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_6());
            }
            // InternalOCLinEcore.g:8667:1: ( rule__DataTypeCS__Alternatives_6 )
            // InternalOCLinEcore.g:8667: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:8691: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:8695:1: ( rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 )
            // InternalOCLinEcore.g:8696: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:8703:1: rule__DataTypeCS__Group_4__0__Impl : ( ':' ) ;
    public final void rule__DataTypeCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8707:1: ( ( ':' ) )
            // InternalOCLinEcore.g:8708:1: ( ':' )
            {
            // InternalOCLinEcore.g:8708:1: ( ':' )
            // InternalOCLinEcore.g:8709:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());
            }
            match(input,98,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:8722: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:8726:1: ( rule__DataTypeCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:8727: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:8733: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:8737:1: ( ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:8738:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:8738:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
            // InternalOCLinEcore.g:8739:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getInstanceClassNameAssignment_4_1());
            }
            // InternalOCLinEcore.g:8740:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
            // InternalOCLinEcore.g:8740: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:8754: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:8758:1: ( rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 )
            // InternalOCLinEcore.g:8759: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:8766:1: rule__DataTypeCS__Group_5__0__Impl : ( '{' ) ;
    public final void rule__DataTypeCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8770:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8771:1: ( '{' )
            {
            // InternalOCLinEcore.g:8771:1: ( '{' )
            // InternalOCLinEcore.g:8772:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());
            }
            match(input,100,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:8785: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:8789:1: ( rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 )
            // InternalOCLinEcore.g:8790: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:8797: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:8801:1: ( ( ( rule__DataTypeCS__Alternatives_5_1 )? ) )
            // InternalOCLinEcore.g:8802:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
            {
            // InternalOCLinEcore.g:8802:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
            // InternalOCLinEcore.g:8803:1: ( rule__DataTypeCS__Alternatives_5_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_5_1());
            }
            // InternalOCLinEcore.g:8804:1: ( rule__DataTypeCS__Alternatives_5_1 )?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==53||LA110_0==58) ) {
                alt110=1;
            }
            switch (alt110) {
                case 1 :
                    // InternalOCLinEcore.g:8804: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:8814: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:8818:1: ( rule__DataTypeCS__Group_5__2__Impl )
            // InternalOCLinEcore.g:8819: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:8825:1: rule__DataTypeCS__Group_5__2__Impl : ( '}' ) ;
    public final void rule__DataTypeCS__Group_5__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8829:1: ( ( '}' ) )
            // InternalOCLinEcore.g:8830:1: ( '}' )
            {
            // InternalOCLinEcore.g:8830:1: ( '}' )
            // InternalOCLinEcore.g:8831:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());
            }
            match(input,101,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:8850: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:8854:1: ( rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 )
            // InternalOCLinEcore.g:8855: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:8862: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:8866:1: ( ( '{' ) )
            // InternalOCLinEcore.g:8867:1: ( '{' )
            {
            // InternalOCLinEcore.g:8867:1: ( '{' )
            // InternalOCLinEcore.g:8868:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
            }
            match(input,100,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:8881: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:8885:1: ( rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 )
            // InternalOCLinEcore.g:8886: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:8893: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:8897:1: ( ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) )
            // InternalOCLinEcore.g:8898:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
            {
            // InternalOCLinEcore.g:8898:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
            // InternalOCLinEcore.g:8899:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getAlternatives_6_0_1());
            }
            // InternalOCLinEcore.g:8900:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
            loop111:
            do {
                int alt111=2;
                int LA111_0 = input.LA(1);

                if ( (LA111_0==20||(LA111_0>=54 && LA111_0<=56)||LA111_0==59) ) {
                    alt111=1;
                }


                switch (alt111) {
            	case 1 :
            	    // InternalOCLinEcore.g:8900: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 loop111;
                }
            } 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:8910: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:8914:1: ( rule__DataTypeCS__Group_6_0__2__Impl )
            // InternalOCLinEcore.g:8915: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:8921: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:8925:1: ( ( '}' ) )
            // InternalOCLinEcore.g:8926:1: ( '}' )
            {
            // InternalOCLinEcore.g:8926:1: ( '}' )
            // InternalOCLinEcore.g:8927:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_2());
            }
            match(input,101,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:8946: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:8950:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
            // InternalOCLinEcore.g:8951: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:8958: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:8962:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:8963:1: ( ( rule__DetailCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:8963:1: ( ( rule__DetailCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:8964:1: ( rule__DetailCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:8965:1: ( rule__DetailCS__NameAssignment_0 )
            // InternalOCLinEcore.g:8965: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:8975: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:8979:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
            // InternalOCLinEcore.g:8980: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:8987:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
    public final void rule__DetailCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:8991:1: ( ( '=' ) )
            // InternalOCLinEcore.g:8992:1: ( '=' )
            {
            // InternalOCLinEcore.g:8992:1: ( '=' )
            // InternalOCLinEcore.g:8993:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());
            }
            match(input,69,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:9006: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:9010:1: ( rule__DetailCS__Group__2__Impl )
            // InternalOCLinEcore.g:9011: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:9017: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:9021:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
            // InternalOCLinEcore.g:9022:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
            {
            // InternalOCLinEcore.g:9022:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
            // InternalOCLinEcore.g:9023:1: ( rule__DetailCS__ValuesAssignment_2 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getValuesAssignment_2());
            }
            // InternalOCLinEcore.g:9024:1: ( rule__DetailCS__ValuesAssignment_2 )*
            loop112:
            do {
                int alt112=2;
                int LA112_0 = input.LA(1);

                if ( ((LA112_0>=RULE_SINGLE_QUOTED_STRING && LA112_0<=RULE_ML_SINGLE_QUOTED_STRING)) ) {
                    alt112=1;
                }


                switch (alt112) {
            	case 1 :
            	    // InternalOCLinEcore.g:9024:2: rule__DetailCS__ValuesAssignment_2
            	    {
            	    pushFollow(FollowSets000.FOLLOW_42);
            	    rule__DetailCS__ValuesAssignment_2();

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

            	    }
            	    break;

            	default :
            	    break loop112;
                }
            } 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:9040: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:9044:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
            // InternalOCLinEcore.g:9045: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:9052:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
    public final void rule__DocumentationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9056:1: ( ( () ) )
            // InternalOCLinEcore.g:9057:1: ( () )
            {
            // InternalOCLinEcore.g:9057:1: ( () )
            // InternalOCLinEcore.g:9058:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0());
            }
            // InternalOCLinEcore.g:9059:1: ()
            // InternalOCLinEcore.g:9061: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:9071: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:9075:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
            // InternalOCLinEcore.g:9076: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:9083:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
    public final void rule__DocumentationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9087:1: ( ( 'documentation' ) )
            // InternalOCLinEcore.g:9088:1: ( 'documentation' )
            {
            // InternalOCLinEcore.g:9088:1: ( 'documentation' )
            // InternalOCLinEcore.g:9089: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:9102: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:9106:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
            // InternalOCLinEcore.g:9107: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:9114: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:9118:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
            // InternalOCLinEcore.g:9119:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
            {
            // InternalOCLinEcore.g:9119:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
            // InternalOCLinEcore.g:9120:1: ( rule__DocumentationCS__ValueAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getValueAssignment_2());
            }
            // InternalOCLinEcore.g:9121:1: ( rule__DocumentationCS__ValueAssignment_2 )?
            int alt113=2;
            int LA113_0 = input.LA(1);

            if ( (LA113_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt113=1;
            }
            switch (alt113) {
                case 1 :
                    // InternalOCLinEcore.g:9121: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:9131: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:9135:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
            // InternalOCLinEcore.g:9136: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:9143: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:9147:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:9148:1: ( ( rule__DocumentationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:9148:1: ( ( rule__DocumentationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:9149:1: ( rule__DocumentationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:9150:1: ( rule__DocumentationCS__Group_3__0 )?
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==96) ) {
                alt114=1;
            }
            switch (alt114) {
                case 1 :
                    // InternalOCLinEcore.g:9150: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:9160: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:9164:1: ( rule__DocumentationCS__Group__4__Impl )
            // InternalOCLinEcore.g:9165: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:9171:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
    public final void rule__DocumentationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9175:1: ( ( ';' ) )
            // InternalOCLinEcore.g:9176:1: ( ';' )
            {
            // InternalOCLinEcore.g:9176:1: ( ';' )
            // InternalOCLinEcore.g:9177: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:9200: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:9204:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
            // InternalOCLinEcore.g:9205: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:9212:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
    public final void rule__DocumentationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9216:1: ( ( '(' ) )
            // InternalOCLinEcore.g:9217:1: ( '(' )
            {
            // InternalOCLinEcore.g:9217:1: ( '(' )
            // InternalOCLinEcore.g:9218:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());
            }
            match(input,96,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:9231: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:9235:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
            // InternalOCLinEcore.g:9236: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:9243: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:9247:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:9248:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:9248:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
            // InternalOCLinEcore.g:9249:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_1());
            }
            // InternalOCLinEcore.g:9250:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
            // InternalOCLinEcore.g:9250: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:9260: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:9264:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
            // InternalOCLinEcore.g:9265: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:9272: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:9276:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
            // InternalOCLinEcore.g:9277:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
            {
            // InternalOCLinEcore.g:9277:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
            // InternalOCLinEcore.g:9278:1: ( rule__DocumentationCS__Group_3_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getGroup_3_2());
            }
            // InternalOCLinEcore.g:9279:1: ( rule__DocumentationCS__Group_3_2__0 )*
            loop115:
            do {
                int alt115=2;
                int LA115_0 = input.LA(1);

                if ( (LA115_0==99) ) {
                    alt115=1;
                }


                switch (alt115) {
            	case 1 :
            	    // InternalOCLinEcore.g:9279: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 loop115;
                }
            } 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:9289: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:9293:1: ( rule__DocumentationCS__Group_3__3__Impl )
            // InternalOCLinEcore.g:9294: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:9300:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
    public final void rule__DocumentationCS__Group_3__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9304:1: ( ( ')' ) )
            // InternalOCLinEcore.g:9305:1: ( ')' )
            {
            // InternalOCLinEcore.g:9305:1: ( ')' )
            // InternalOCLinEcore.g:9306:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());
            }
            match(input,97,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:9327: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:9331:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
            // InternalOCLinEcore.g:9332: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:9339: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:9343:1: ( ( ',' ) )
            // InternalOCLinEcore.g:9344:1: ( ',' )
            {
            // InternalOCLinEcore.g:9344:1: ( ',' )
            // InternalOCLinEcore.g:9345:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());
            }
            match(input,99,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:9358: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:9362:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
            // InternalOCLinEcore.g:9363: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:9369: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:9373:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
            // InternalOCLinEcore.g:9374:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
            {
            // InternalOCLinEcore.g:9374:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
            // InternalOCLinEcore.g:9375:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_2_1());
            }
            // InternalOCLinEcore.g:9376:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
            // InternalOCLinEcore.g:9376: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:9390: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:9394:1: ( rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 )
            // InternalOCLinEcore.g:9395: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:9402:1: rule__EnumerationCS__Group__0__Impl : ( 'enum' ) ;
    public final void rule__EnumerationCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9406:1: ( ( 'enum' ) )
            // InternalOCLinEcore.g:9407:1: ( 'enum' )
            {
            // InternalOCLinEcore.g:9407:1: ( 'enum' )
            // InternalOCLinEcore.g:9408: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:9421: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:9425:1: ( rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 )
            // InternalOCLinEcore.g:9426: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:9433: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:9437:1: ( ( ( rule__EnumerationCS__NameAssignment_1 ) ) )
            // InternalOCLinEcore.g:9438:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:9438:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
            // InternalOCLinEcore.g:9439:1: ( rule__EnumerationCS__NameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getNameAssignment_1());
            }
            // InternalOCLinEcore.g:9440:1: ( rule__EnumerationCS__NameAssignment_1 )
            // InternalOCLinEcore.g:9440: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:9450: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:9454:1: ( rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 )
            // InternalOCLinEcore.g:9455: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:9462: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:9466:1: ( ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) )
            // InternalOCLinEcore.g:9467:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
            {
            // InternalOCLinEcore.g:9467:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
            // InternalOCLinEcore.g:9468:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getOwnedSignatureAssignment_2());
            }
            // InternalOCLinEcore.g:9469:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==66||LA116_0==96) ) {
                alt116=1;
            }
            switch (alt116) {
                case 1 :
                    // InternalOCLinEcore.g:9469: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:9479: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:9483:1: ( rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 )
            // InternalOCLinEcore.g:9484: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:9491: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:9495:1: ( ( ( rule__EnumerationCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:9496:1: ( ( rule__EnumerationCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:9496:1: ( ( rule__EnumerationCS__Group_3__0 )? )
            // InternalOCLinEcore.g:9497:1: ( rule__EnumerationCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:9498:1: ( rule__EnumerationCS__Group_3__0 )?
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( (LA117_0==98) ) {
                alt117=1;
            }
            switch (alt117) {
                case 1 :
                    // InternalOCLinEcore.g:9498: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:9508: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:9512:1: ( rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 )
            // InternalOCLinEcore.g:9513: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:9520: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:9524:1: ( ( ( rule__EnumerationCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:9525:1: ( ( rule__EnumerationCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:9525:1: ( ( rule__EnumerationCS__Group_4__0 )? )
            // InternalOCLinEcore.g:9526:1: ( rule__EnumerationCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:9527:1: ( rule__EnumerationCS__Group_4__0 )?
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( (LA118_0==100) ) {
                int LA118_1 = input.LA(2);

                if ( (LA118_1==53||LA118_1==58) ) {
                    alt118=1;
                }
                else if ( (LA118_1==101) ) {
                    int LA118_4 = input.LA(3);

                    if ( (LA118_4==52||LA118_4==100) ) {
                        alt118=1;
                    }
                }
            }
            switch (alt118) {
                case 1 :
                    // InternalOCLinEcore.g:9527: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:9537: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:9541:1: ( rule__EnumerationCS__Group__5__Impl )
            // InternalOCLinEcore.g:9542: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:9548: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:9552:1: ( ( ( rule__EnumerationCS__Alternatives_5 ) ) )
            // InternalOCLinEcore.g:9553:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
            {
            // InternalOCLinEcore.g:9553:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
            // InternalOCLinEcore.g:9554:1: ( rule__EnumerationCS__Alternatives_5 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_5());
            }
            // InternalOCLinEcore.g:9555:1: ( rule__EnumerationCS__Alternatives_5 )
            // InternalOCLinEcore.g:9555: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:9577: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:9581:1: ( rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 )
            // InternalOCLinEcore.g:9582: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:9589:1: rule__EnumerationCS__Group_3__0__Impl : ( ':' ) ;
    public final void rule__EnumerationCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9593:1: ( ( ':' ) )
            // InternalOCLinEcore.g:9594:1: ( ':' )
            {
            // InternalOCLinEcore.g:9594:1: ( ':' )
            // InternalOCLinEcore.g:9595:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());
            }
            match(input,98,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:9608: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:9612:1: ( rule__EnumerationCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:9613: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:9619: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:9623:1: ( ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:9624:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:9624:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
            // InternalOCLinEcore.g:9625:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getInstanceClassNameAssignment_3_1());
            }
            // InternalOCLinEcore.g:9626:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
            // InternalOCLinEcore.g:9626: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:9640: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:9644:1: ( rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 )
            // InternalOCLinEcore.g:9645: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:9652:1: rule__EnumerationCS__Group_4__0__Impl : ( '{' ) ;
    public final void rule__EnumerationCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9656:1: ( ( '{' ) )
            // InternalOCLinEcore.g:9657:1: ( '{' )
            {
            // InternalOCLinEcore.g:9657:1: ( '{' )
            // InternalOCLinEcore.g:9658:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());
            }
            match(input,100,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:9671: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:9675:1: ( rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 )
            // InternalOCLinEcore.g:9676: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:9683: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:9687:1: ( ( ( rule__EnumerationCS__Alternatives_4_1 )? ) )
            // InternalOCLinEcore.g:9688:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
            {
            // InternalOCLinEcore.g:9688:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
            // InternalOCLinEcore.g:9689:1: ( rule__EnumerationCS__Alternatives_4_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_4_1());
            }
            // InternalOCLinEcore.g:9690:1: ( rule__EnumerationCS__Alternatives_4_1 )?
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==53||LA119_0==58) ) {
                alt119=1;
            }
            switch (alt119) {
                case 1 :
                    // InternalOCLinEcore.g:9690: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:9700: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:9704:1: ( rule__EnumerationCS__Group_4__2__Impl )
            // InternalOCLinEcore.g:9705: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:9711:1: rule__EnumerationCS__Group_4__2__Impl : ( '}' ) ;
    public final void rule__EnumerationCS__Group_4__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9715:1: ( ( '}' ) )
            // InternalOCLinEcore.g:9716:1: ( '}' )
            {
            // InternalOCLinEcore.g:9716:1: ( '}' )
            // InternalOCLinEcore.g:9717:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());
            }
            match(input,101,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:9736: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:9740:1: ( rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 )
            // InternalOCLinEcore.g:9741: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:9748: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:9752:1: ( ( '{' ) )
            // InternalOCLinEcore.g:9753:1: ( '{' )
            {
            // InternalOCLinEcore.g:9753:1: ( '{' )
            // InternalOCLinEcore.g:9754:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());
            }
            match(input,100,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:9767: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:9771:1: ( rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 )
            // InternalOCLinEcore.g:9772: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:9779: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:9783:1: ( ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) )
            // InternalOCLinEcore.g:9784:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
            {
            // InternalOCLinEcore.g:9784:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
            // InternalOCLinEcore.g:9785:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getAlternatives_5_0_1());
            }
            // InternalOCLinEcore.g:9786:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
            loop120:
            do {
                int alt120=2;
                int LA120_0 = input.LA(1);

                if ( ((LA120_0>=RULE_SIMPLE_ID && LA120_0<=RULE_ESCAPED_ID)||(LA120_0>=17 && LA120_0<=51)||(LA120_0>=54 && LA120_0<=57)||LA120_0==59) ) {
                    alt120=1;
                }


                switch (alt120) {
            	case 1 :
            	    // InternalOCLinEcore.g:9786: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 loop120;
                }
            } 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:9796: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:9800:1: ( rule__EnumerationCS__Group_5_0__2__Impl )
            // InternalOCLinEcore.g:9801: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:9807: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:9811:1: ( ( '}' ) )
            // InternalOCLinEcore.g:9812:1: ( '}' )
            {
            // InternalOCLinEcore.g:9812:1: ( '}' )
            // InternalOCLinEcore.g:9813:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());
            }
            match(input,101,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:9832: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:9836:1: ( rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 )
            // InternalOCLinEcore.g:9837:2: rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_47);
            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:9844: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:9848:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) )
            // InternalOCLinEcore.g:9849:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
            {
            // InternalOCLinEcore.g:9849:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
            // InternalOCLinEcore.g:9850:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:9851:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
            // InternalOCLinEcore.g:9851: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:9861: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:9865:1: ( rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 )
            // InternalOCLinEcore.g:9866:2: rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_47);
            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:9873: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:9877:1: ( ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:9878:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:9878:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
            // InternalOCLinEcore.g:9879:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:9880:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==69) ) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // InternalOCLinEcore.g:9880: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:9890:1: rule__EnumerationLiteralCS__Group__2 : rule__EnumerationLiteralCS__Group__2__Impl ;
    public final void rule__EnumerationLiteralCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9894:1: ( rule__EnumerationLiteralCS__Group__2__Impl )
            // InternalOCLinEcore.g:9895:2: rule__EnumerationLiteralCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Group__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__2"


    // $ANTLR start "rule__EnumerationLiteralCS__Group__2__Impl"
    // InternalOCLinEcore.g:9901:1: rule__EnumerationLiteralCS__Group__2__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_2 ) ) ;
    public final void rule__EnumerationLiteralCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:9905:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_2 ) ) )
            // InternalOCLinEcore.g:9906:1: ( ( rule__EnumerationLiteralCS__Alternatives_2 ) )
            {
            // InternalOCLinEcore.g:9906:1: ( ( rule__EnumerationLiteralCS__Alternatives_2 ) )
            // InternalOCLinEcore.g:9907:1: ( rule__EnumerationLiteralCS__Alternatives_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:9908:1: ( rule__EnumerationLiteralCS__Alternatives_2 )
            // InternalOCLinEcore.g:9908:2: rule__EnumerationLiteralCS__Alternatives_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__Alternatives_2();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_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_0_0__0"
    // InternalOCLinEcore.g:9924: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:9928:1: ( rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 )
            // InternalOCLinEcore.g:9929: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:9936: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:9940:1: ( ( 'literal' ) )
            // InternalOCLinEcore.g:9941:1: ( 'literal' )
            {
            // InternalOCLinEcore.g:9941:1: ( 'literal' )
            // InternalOCLinEcore.g:9942: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:9955: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:9959:1: ( rule__EnumerationLiteralCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:9960: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:9966: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:9970:1: ( ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) )
            // InternalOCLinEcore.g:9971:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
            {
            // InternalOCLinEcore.g:9971:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
            // InternalOCLinEcore.g:9972:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:9973:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
            // InternalOCLinEcore.g:9973: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:9987: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:9991:1: ( rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 )
            // InternalOCLinEcore.g:9992:2: rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_48);
            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:9999:1: rule__EnumerationLiteralCS__Group_1__0__Impl : ( '=' ) ;
    public final void rule__EnumerationLiteralCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10003:1: ( ( '=' ) )
            // InternalOCLinEcore.g:10004:1: ( '=' )
            {
            // InternalOCLinEcore.g:10004:1: ( '=' )
            // InternalOCLinEcore.g:10005:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_1_0());
            }
            match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_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:10018: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:10022:1: ( rule__EnumerationLiteralCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:10023: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:10029:1: rule__EnumerationLiteralCS__Group_1__1__Impl : ( ( rule__EnumerationLiteralCS__ValueAssignment_1_1 ) ) ;
    public final void rule__EnumerationLiteralCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10033:1: ( ( ( rule__EnumerationLiteralCS__ValueAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:10034:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:10034:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_1_1 ) )
            // InternalOCLinEcore.g:10035:1: ( rule__EnumerationLiteralCS__ValueAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getValueAssignment_1_1());
            }
            // InternalOCLinEcore.g:10036:1: ( rule__EnumerationLiteralCS__ValueAssignment_1_1 )
            // InternalOCLinEcore.g:10036:2: rule__EnumerationLiteralCS__ValueAssignment_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__ValueAssignment_1_1();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getValueAssignment_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__0"
    // InternalOCLinEcore.g:10050:1: rule__EnumerationLiteralCS__Group_2_0__0 : rule__EnumerationLiteralCS__Group_2_0__0__Impl rule__EnumerationLiteralCS__Group_2_0__1 ;
    public final void rule__EnumerationLiteralCS__Group_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10054:1: ( rule__EnumerationLiteralCS__Group_2_0__0__Impl rule__EnumerationLiteralCS__Group_2_0__1 )
            // InternalOCLinEcore.g:10055:2: rule__EnumerationLiteralCS__Group_2_0__0__Impl rule__EnumerationLiteralCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_49);
            rule__EnumerationLiteralCS__Group_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__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__EnumerationLiteralCS__Group_2_0__0"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2_0__0__Impl"
    // InternalOCLinEcore.g:10062:1: rule__EnumerationLiteralCS__Group_2_0__0__Impl : ( '{' ) ;
    public final void rule__EnumerationLiteralCS__Group_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10066:1: ( ( '{' ) )
            // InternalOCLinEcore.g:10067:1: ( '{' )
            {
            // InternalOCLinEcore.g:10067:1: ( '{' )
            // InternalOCLinEcore.g:10068:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_2_0_0());
            }
            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_2_0_0());
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2_0__1"
    // InternalOCLinEcore.g:10081:1: rule__EnumerationLiteralCS__Group_2_0__1 : rule__EnumerationLiteralCS__Group_2_0__1__Impl rule__EnumerationLiteralCS__Group_2_0__2 ;
    public final void rule__EnumerationLiteralCS__Group_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10085:1: ( rule__EnumerationLiteralCS__Group_2_0__1__Impl rule__EnumerationLiteralCS__Group_2_0__2 )
            // InternalOCLinEcore.g:10086:2: rule__EnumerationLiteralCS__Group_2_0__1__Impl rule__EnumerationLiteralCS__Group_2_0__2
            {
            pushFollow(FollowSets000.FOLLOW_49);
            rule__EnumerationLiteralCS__Group_2_0__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__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__EnumerationLiteralCS__Group_2_0__1"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2_0__1__Impl"
    // InternalOCLinEcore.g:10093:1: rule__EnumerationLiteralCS__Group_2_0__1__Impl : ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )* ) ;
    public final void rule__EnumerationLiteralCS__Group_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10097:1: ( ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )* ) )
            // InternalOCLinEcore.g:10098:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )* )
            {
            // InternalOCLinEcore.g:10098:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )* )
            // InternalOCLinEcore.g:10099:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAssignment_2_0_1());
            }
            // InternalOCLinEcore.g:10100:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1 )*
            loop122:
            do {
                int alt122=2;
                int LA122_0 = input.LA(1);

                if ( ((LA122_0>=54 && LA122_0<=55)||LA122_0==59) ) {
                    alt122=1;
                }


                switch (alt122) {
            	case 1 :
            	    // InternalOCLinEcore.g:10100:2: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_50);
            	    rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_2_0_1();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2_0__2"
    // InternalOCLinEcore.g:10110:1: rule__EnumerationLiteralCS__Group_2_0__2 : rule__EnumerationLiteralCS__Group_2_0__2__Impl ;
    public final void rule__EnumerationLiteralCS__Group_2_0__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10114:1: ( rule__EnumerationLiteralCS__Group_2_0__2__Impl )
            // InternalOCLinEcore.g:10115:2: rule__EnumerationLiteralCS__Group_2_0__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__EnumerationLiteralCS__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__EnumerationLiteralCS__Group_2_0__2"


    // $ANTLR start "rule__EnumerationLiteralCS__Group_2_0__2__Impl"
    // InternalOCLinEcore.g:10121:1: rule__EnumerationLiteralCS__Group_2_0__2__Impl : ( '}' ) ;
    public final void rule__EnumerationLiteralCS__Group_2_0__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10125:1: ( ( '}' ) )
            // InternalOCLinEcore.g:10126:1: ( '}' )
            {
            // InternalOCLinEcore.g:10126:1: ( '}' )
            // InternalOCLinEcore.g:10127:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_2_0_2());
            }
            match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_2_0_2());
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ImportCS__Group__0"
    // InternalOCLinEcore.g:10146: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:10150:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
            // InternalOCLinEcore.g:10151: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:10158: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:10162:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
            // InternalOCLinEcore.g:10163:1: ( ( rule__ImportCS__Alternatives_0 ) )
            {
            // InternalOCLinEcore.g:10163:1: ( ( rule__ImportCS__Alternatives_0 ) )
            // InternalOCLinEcore.g:10164:1: ( rule__ImportCS__Alternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:10165:1: ( rule__ImportCS__Alternatives_0 )
            // InternalOCLinEcore.g:10165: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:10175: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:10179:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
            // InternalOCLinEcore.g:10180: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:10187: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:10191:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:10192:1: ( ( rule__ImportCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:10192:1: ( ( rule__ImportCS__Group_1__0 )? )
            // InternalOCLinEcore.g:10193:1: ( rule__ImportCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:10194:1: ( rule__ImportCS__Group_1__0 )?
            int alt123=2;
            alt123 = dfa123.predict(input);
            switch (alt123) {
                case 1 :
                    // InternalOCLinEcore.g:10194: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:10204: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:10208:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
            // InternalOCLinEcore.g:10209:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_51);
            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:10216: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:10220:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
            // InternalOCLinEcore.g:10221:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:10221:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
            // InternalOCLinEcore.g:10222:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
            }
            // InternalOCLinEcore.g:10223:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
            // InternalOCLinEcore.g:10223: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:10233: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:10237:1: ( rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 )
            // InternalOCLinEcore.g:10238:2: rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_51);
            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:10245: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:10249:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
            // InternalOCLinEcore.g:10250:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
            {
            // InternalOCLinEcore.g:10250:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
            // InternalOCLinEcore.g:10251:1: ( rule__ImportCS__IsAllAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
            }
            // InternalOCLinEcore.g:10252:1: ( rule__ImportCS__IsAllAssignment_3 )?
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==130) ) {
                alt124=1;
            }
            switch (alt124) {
                case 1 :
                    // InternalOCLinEcore.g:10252: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:10262: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:10266:1: ( rule__ImportCS__Group__4__Impl )
            // InternalOCLinEcore.g:10267: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:10273:1: rule__ImportCS__Group__4__Impl : ( ';' ) ;
    public final void rule__ImportCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10277:1: ( ( ';' ) )
            // InternalOCLinEcore.g:10278:1: ( ';' )
            {
            // InternalOCLinEcore.g:10278:1: ( ';' )
            // InternalOCLinEcore.g:10279: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:10302: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:10306:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
            // InternalOCLinEcore.g:10307:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_52);
            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:10314: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:10318:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:10319:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:10319:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
            // InternalOCLinEcore.g:10320:1: ( rule__ImportCS__NameAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
            }
            // InternalOCLinEcore.g:10321:1: ( rule__ImportCS__NameAssignment_1_0 )
            // InternalOCLinEcore.g:10321: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:10331: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:10335:1: ( rule__ImportCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:10336: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:10342:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
    public final void rule__ImportCS__Group_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10346:1: ( ( ':' ) )
            // InternalOCLinEcore.g:10347:1: ( ':' )
            {
            // InternalOCLinEcore.g:10347:1: ( ':' )
            // InternalOCLinEcore.g:10348:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
            }
            match(input,98,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:10365: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:10369:1: ( rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 )
            // InternalOCLinEcore.g:10370: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:10377:1: rule__ModelElementRefCS__Group__0__Impl : ( 'reference' ) ;
    public final void rule__ModelElementRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10381:1: ( ( 'reference' ) )
            // InternalOCLinEcore.g:10382:1: ( 'reference' )
            {
            // InternalOCLinEcore.g:10382:1: ( 'reference' )
            // InternalOCLinEcore.g:10383: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:10396: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:10400:1: ( rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 )
            // InternalOCLinEcore.g:10401:2: rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_53);
            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:10408: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:10412:1: ( ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) )
            // InternalOCLinEcore.g:10413:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:10413:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
            // InternalOCLinEcore.g:10414:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getModelElementRefCSAccess().getOwnedPathNameAssignment_1());
            }
            // InternalOCLinEcore.g:10415:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
            // InternalOCLinEcore.g:10415: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:10425: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:10429:1: ( rule__ModelElementRefCS__Group__2__Impl )
            // InternalOCLinEcore.g:10430: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:10436:1: rule__ModelElementRefCS__Group__2__Impl : ( ';' ) ;
    public final void rule__ModelElementRefCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10440:1: ( ( ';' ) )
            // InternalOCLinEcore.g:10441:1: ( ';' )
            {
            // InternalOCLinEcore.g:10441:1: ( ';' )
            // InternalOCLinEcore.g:10442: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:10461: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:10465:1: ( rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 )
            // InternalOCLinEcore.g:10466:2: rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_54);
            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:10473: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:10477:1: ( ( ( rule__OperationCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:10478:1: ( ( rule__OperationCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:10478:1: ( ( rule__OperationCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:10479:1: ( rule__OperationCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:10480:1: ( rule__OperationCS__Alternatives_0 )?
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==24||LA125_0==46) ) {
                alt125=1;
            }
            switch (alt125) {
                case 1 :
                    // InternalOCLinEcore.g:10480: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:10490: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:10494:1: ( rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 )
            // InternalOCLinEcore.g:10495:2: rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_55);
            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:10502:1: rule__OperationCS__Group__1__Impl : ( 'operation' ) ;
    public final void rule__OperationCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10506:1: ( ( 'operation' ) )
            // InternalOCLinEcore.g:10507:1: ( 'operation' )
            {
            // InternalOCLinEcore.g:10507:1: ( 'operation' )
            // InternalOCLinEcore.g:10508: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:10521: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:10525:1: ( rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 )
            // InternalOCLinEcore.g:10526:2: rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_55);
            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:10533: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:10537:1: ( ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) )
            // InternalOCLinEcore.g:10538:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
            {
            // InternalOCLinEcore.g:10538:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
            // InternalOCLinEcore.g:10539:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedSignatureAssignment_2());
            }
            // InternalOCLinEcore.g:10540:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
            int alt126=2;
            int LA126_0 = input.LA(1);

            if ( (LA126_0==66||LA126_0==96) ) {
                alt126=1;
            }
            switch (alt126) {
                case 1 :
                    // InternalOCLinEcore.g:10540: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:10550: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:10554:1: ( rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 )
            // InternalOCLinEcore.g:10555: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:10562: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:10566:1: ( ( ( rule__OperationCS__NameAssignment_3 ) ) )
            // InternalOCLinEcore.g:10567:1: ( ( rule__OperationCS__NameAssignment_3 ) )
            {
            // InternalOCLinEcore.g:10567:1: ( ( rule__OperationCS__NameAssignment_3 ) )
            // InternalOCLinEcore.g:10568:1: ( rule__OperationCS__NameAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getNameAssignment_3());
            }
            // InternalOCLinEcore.g:10569:1: ( rule__OperationCS__NameAssignment_3 )
            // InternalOCLinEcore.g:10569: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:10579: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:10583:1: ( rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 )
            // InternalOCLinEcore.g:10584:2: rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_56);
            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:10591:1: rule__OperationCS__Group__4__Impl : ( '(' ) ;
    public final void rule__OperationCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10595:1: ( ( '(' ) )
            // InternalOCLinEcore.g:10596:1: ( '(' )
            {
            // InternalOCLinEcore.g:10596:1: ( '(' )
            // InternalOCLinEcore.g:10597:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());
            }
            match(input,96,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:10610: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:10614:1: ( rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 )
            // InternalOCLinEcore.g:10615:2: rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6
            {
            pushFollow(FollowSets000.FOLLOW_56);
            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:10622: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:10626:1: ( ( ( rule__OperationCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:10627:1: ( ( rule__OperationCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:10627:1: ( ( rule__OperationCS__Group_5__0 )? )
            // InternalOCLinEcore.g:10628:1: ( rule__OperationCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:10629:1: ( rule__OperationCS__Group_5__0 )?
            int alt127=2;
            int LA127_0 = input.LA(1);

            if ( ((LA127_0>=RULE_SIMPLE_ID && LA127_0<=RULE_ESCAPED_ID)||(LA127_0>=17 && LA127_0<=51)||(LA127_0>=54 && LA127_0<=59)) ) {
                alt127=1;
            }
            switch (alt127) {
                case 1 :
                    // InternalOCLinEcore.g:10629: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:10639: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:10643:1: ( rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 )
            // InternalOCLinEcore.g:10644:2: rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_57);
            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:10651:1: rule__OperationCS__Group__6__Impl : ( ')' ) ;
    public final void rule__OperationCS__Group__6__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:10655:1: ( ( ')' ) )
            // InternalOCLinEcore.g:10656:1: ( ')' )
            {
            // InternalOCLinEcore.g:10656:1: ( ')' )
            // InternalOCLinEcore.g:10657:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());
            }
            match(input,97,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:10670: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:10674:1: ( rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 )
            // InternalOCLinEcore.g:10675:2: rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8
            {
            pushFollow(FollowSets000.FOLLOW_57);
            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:10682: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:10686:1: ( ( ( rule__OperationCS__Group_7__0 )? ) )
            // InternalOCLinEcore.g:10687:1: ( ( rule__OperationCS__Group_7__0 )? )
            {
            // InternalOCLinEcore.g:10687:1: ( ( rule__OperationCS__Group_7__0 )? )
            // InternalOCLinEcore.g:10688:1: ( rule__OperationCS__Group_7__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_7());
            }
            // InternalOCLinEcore.g:10689:1: ( rule__OperationCS__Group_7__0 )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==98) ) {
                alt128=1;
            }
            switch (alt128) {
                case 1 :
                    // InternalOCLinEcore.g:10689: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:10699: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:10703:1: ( rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 )
            // InternalOCLinEcore.g:10704:2: rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9
            {
            pushFollow(FollowSets000.FOLLOW_57);
            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:10711: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:10715:1: ( ( ( rule__OperationCS__Group_8__0 )? ) )
            // InternalOCLinEcore.g:10716:1: ( ( rule__OperationCS__Group_8__0 )? )
            {
            // InternalOCLinEcore.g:10716:1: ( ( rule__OperationCS__Group_8__0 )? )
            // InternalOCLinEcore.g:10717:1: ( rule__OperationCS__Group_8__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_8());
            }
            // InternalOCLinEcore.g:10718:1: ( rule__OperationCS__Group_8__0 )?
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==47) ) {
                alt129=1;
            }
            switch (alt129) {
                case 1 :
                    // InternalOCLinEcore.g:10718: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:10728: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:10732:1: ( rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 )
            // InternalOCLinEcore.g:10733:2: rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10
            {
            pushFollow(FollowSets000.FOLLOW_57);
            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:10740: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:10744:1: ( ( ( rule__OperationCS__Group_9__0 )? ) )
            // InternalOCLinEcore.g:10745:1: ( ( rule__OperationCS__Group_9__0 )? )
            {
            // InternalOCLinEcore.g:10745:1: ( ( rule__OperationCS__Group_9__0 )? )
            // InternalOCLinEcore.g:10746:1: ( rule__OperationCS__Group_9__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9());
            }
            // InternalOCLinEcore.g:10747:1: ( rule__OperationCS__Group_9__0 )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==100) ) {
                int LA130_1 = input.LA(2);

                if ( (LA130_1==26||LA130_1==37||(LA130_1>=48 && LA130_1<=49)||LA130_1==122||LA130_1==124||(LA130_1>=126 && LA130_1<=127)) ) {
                    alt130=1;
                }
            }
            switch (alt130) {
                case 1 :
                    // InternalOCLinEcore.g:10747: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:10757: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:10761:1: ( rule__OperationCS__Group__10__Impl )
            // InternalOCLinEcore.g:10762: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:10768: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:10772:1: ( ( ( rule__OperationCS__Alternatives_10 ) ) )
            // InternalOCLinEcore.g:10773:1: ( ( rule__OperationCS__Alternatives_10 ) )
            {
            // InternalOCLinEcore.g:10773:1: ( ( rule__OperationCS__Alternatives_10 ) )
            // InternalOCLinEcore.g:10774:1: ( rule__OperationCS__Alternatives_10 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_10());
            }
            // InternalOCLinEcore.g:10775:1: ( rule__OperationCS__Alternatives_10 )
            // InternalOCLinEcore.g:10775: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:10807: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:10811:1: ( rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 )
            // InternalOCLinEcore.g:10812: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:10819: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:10823:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:10824:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:10824:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:10825:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:10826:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:10826: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:10836: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:10840:1: ( rule__OperationCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:10841: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:10847: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:10851:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:10852:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:10852:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:10853:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:10854:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( (LA131_0==24) ) {
                alt131=1;
            }
            switch (alt131) {
                case 1 :
                    // InternalOCLinEcore.g:10854: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:10868: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:10872:1: ( rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 )
            // InternalOCLinEcore.g:10873: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:10880: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:10884:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:10885:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:10885:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:10886:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:10887:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:10887: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:10897: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:10901:1: ( rule__OperationCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:10902: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:10908: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:10912:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:10913:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:10913:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:10914:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:10915:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==46) ) {
                alt132=1;
            }
            switch (alt132) {
                case 1 :
                    // InternalOCLinEcore.g:10915: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:10929: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:10933:1: ( rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 )
            // InternalOCLinEcore.g:10934: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:10941: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:10945:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) )
            // InternalOCLinEcore.g:10946:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
            {
            // InternalOCLinEcore.g:10946:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
            // InternalOCLinEcore.g:10947:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_0());
            }
            // InternalOCLinEcore.g:10948:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
            // InternalOCLinEcore.g:10948: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:10958: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:10962:1: ( rule__OperationCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:10963: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:10969: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:10973:1: ( ( ( rule__OperationCS__Group_5_1__0 )* ) )
            // InternalOCLinEcore.g:10974:1: ( ( rule__OperationCS__Group_5_1__0 )* )
            {
            // InternalOCLinEcore.g:10974:1: ( ( rule__OperationCS__Group_5_1__0 )* )
            // InternalOCLinEcore.g:10975:1: ( rule__OperationCS__Group_5_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_5_1());
            }
            // InternalOCLinEcore.g:10976:1: ( rule__OperationCS__Group_5_1__0 )*
            loop133:
            do {
                int alt133=2;
                int LA133_0 = input.LA(1);

                if ( (LA133_0==99) ) {
                    alt133=1;
                }


                switch (alt133) {
            	case 1 :
            	    // InternalOCLinEcore.g:10976: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 loop133;
                }
            } 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:10990: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:10994:1: ( rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 )
            // InternalOCLinEcore.g:10995: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:11002: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:11006:1: ( ( ',' ) )
            // InternalOCLinEcore.g:11007:1: ( ',' )
            {
            // InternalOCLinEcore.g:11007:1: ( ',' )
            // InternalOCLinEcore.g:11008:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());
            }
            match(input,99,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:11021: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:11025:1: ( rule__OperationCS__Group_5_1__1__Impl )
            // InternalOCLinEcore.g:11026: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:11032: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:11036:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) )
            // InternalOCLinEcore.g:11037:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
            {
            // InternalOCLinEcore.g:11037:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
            // InternalOCLinEcore.g:11038:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_1_1());
            }
            // InternalOCLinEcore.g:11039:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
            // InternalOCLinEcore.g:11039: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:11053: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:11057:1: ( rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 )
            // InternalOCLinEcore.g:11058: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:11065:1: rule__OperationCS__Group_7__0__Impl : ( ':' ) ;
    public final void rule__OperationCS__Group_7__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11069:1: ( ( ':' ) )
            // InternalOCLinEcore.g:11070:1: ( ':' )
            {
            // InternalOCLinEcore.g:11070:1: ( ':' )
            // InternalOCLinEcore.g:11071:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getColonKeyword_7_0());
            }
            match(input,98,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:11084: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:11088:1: ( rule__OperationCS__Group_7__1__Impl )
            // InternalOCLinEcore.g:11089: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:11095: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:11099:1: ( ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) )
            // InternalOCLinEcore.g:11100:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
            {
            // InternalOCLinEcore.g:11100:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
            // InternalOCLinEcore.g:11101:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedTypeAssignment_7_1());
            }
            // InternalOCLinEcore.g:11102:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
            // InternalOCLinEcore.g:11102: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:11116: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:11120:1: ( rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 )
            // InternalOCLinEcore.g:11121: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:11128: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:11132:1: ( ( 'throws' ) )
            // InternalOCLinEcore.g:11133:1: ( 'throws' )
            {
            // InternalOCLinEcore.g:11133:1: ( 'throws' )
            // InternalOCLinEcore.g:11134: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:11147: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:11151:1: ( rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 )
            // InternalOCLinEcore.g:11152: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:11159: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:11163:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) )
            // InternalOCLinEcore.g:11164:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
            {
            // InternalOCLinEcore.g:11164:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
            // InternalOCLinEcore.g:11165:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_1());
            }
            // InternalOCLinEcore.g:11166:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
            // InternalOCLinEcore.g:11166: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:11176: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:11180:1: ( rule__OperationCS__Group_8__2__Impl )
            // InternalOCLinEcore.g:11181: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:11187: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:11191:1: ( ( ( rule__OperationCS__Group_8_2__0 )* ) )
            // InternalOCLinEcore.g:11192:1: ( ( rule__OperationCS__Group_8_2__0 )* )
            {
            // InternalOCLinEcore.g:11192:1: ( ( rule__OperationCS__Group_8_2__0 )* )
            // InternalOCLinEcore.g:11193:1: ( rule__OperationCS__Group_8_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_8_2());
            }
            // InternalOCLinEcore.g:11194:1: ( rule__OperationCS__Group_8_2__0 )*
            loop134:
            do {
                int alt134=2;
                int LA134_0 = input.LA(1);

                if ( (LA134_0==99) ) {
                    alt134=1;
                }


                switch (alt134) {
            	case 1 :
            	    // InternalOCLinEcore.g:11194: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 loop134;
                }
            } 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:11210: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:11214:1: ( rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 )
            // InternalOCLinEcore.g:11215: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:11222: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:11226:1: ( ( ',' ) )
            // InternalOCLinEcore.g:11227:1: ( ',' )
            {
            // InternalOCLinEcore.g:11227:1: ( ',' )
            // InternalOCLinEcore.g:11228:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());
            }
            match(input,99,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:11241: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:11245:1: ( rule__OperationCS__Group_8_2__1__Impl )
            // InternalOCLinEcore.g:11246: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:11252: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:11256:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) )
            // InternalOCLinEcore.g:11257:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
            {
            // InternalOCLinEcore.g:11257:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
            // InternalOCLinEcore.g:11258:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_2_1());
            }
            // InternalOCLinEcore.g:11259:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
            // InternalOCLinEcore.g:11259: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:11273: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:11277:1: ( rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 )
            // InternalOCLinEcore.g:11278:2: rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1
            {
            pushFollow(FollowSets000.FOLLOW_58);
            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:11285:1: rule__OperationCS__Group_9__0__Impl : ( '{' ) ;
    public final void rule__OperationCS__Group_9__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11289:1: ( ( '{' ) )
            // InternalOCLinEcore.g:11290:1: ( '{' )
            {
            // InternalOCLinEcore.g:11290:1: ( '{' )
            // InternalOCLinEcore.g:11291:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());
            }
            match(input,100,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:11304: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:11308:1: ( rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 )
            // InternalOCLinEcore.g:11309: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:11316: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:11320:1: ( ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) )
            // InternalOCLinEcore.g:11321:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
            {
            // InternalOCLinEcore.g:11321:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
            // InternalOCLinEcore.g:11322:1: ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* )
            {
            // InternalOCLinEcore.g:11322:1: ( ( rule__OperationCS__Group_9_1__0 ) )
            // InternalOCLinEcore.g:11323:1: ( rule__OperationCS__Group_9_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }
            // InternalOCLinEcore.g:11324:1: ( rule__OperationCS__Group_9_1__0 )
            // InternalOCLinEcore.g:11324:2: rule__OperationCS__Group_9_1__0
            {
            pushFollow(FollowSets000.FOLLOW_59);
            rule__OperationCS__Group_9_1__0();

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

            }

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

            }

            // InternalOCLinEcore.g:11327:1: ( ( rule__OperationCS__Group_9_1__0 )* )
            // InternalOCLinEcore.g:11328:1: ( rule__OperationCS__Group_9_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getGroup_9_1());
            }
            // InternalOCLinEcore.g:11329:1: ( rule__OperationCS__Group_9_1__0 )*
            loop135:
            do {
                int alt135=2;
                int LA135_0 = input.LA(1);

                if ( (LA135_0==26||LA135_0==37||(LA135_0>=48 && LA135_0<=49)||LA135_0==122||LA135_0==124||(LA135_0>=126 && LA135_0<=127)) ) {
                    alt135=1;
                }


                switch (alt135) {
            	case 1 :
            	    // InternalOCLinEcore.g:11329:2: rule__OperationCS__Group_9_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_59);
            	    rule__OperationCS__Group_9_1__0();

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

            	    }
            	    break;

            	default :
            	    break loop135;
                }
            } 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:11340: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:11344:1: ( rule__OperationCS__Group_9__2__Impl )
            // InternalOCLinEcore.g:11345: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:11351:1: rule__OperationCS__Group_9__2__Impl : ( '}' ) ;
    public final void rule__OperationCS__Group_9__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11355:1: ( ( '}' ) )
            // InternalOCLinEcore.g:11356:1: ( '}' )
            {
            // InternalOCLinEcore.g:11356:1: ( '}' )
            // InternalOCLinEcore.g:11357:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());
            }
            match(input,101,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:11376: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:11380:1: ( rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 )
            // InternalOCLinEcore.g:11381: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:11388: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:11392:1: ( ( ( rule__OperationCS__Alternatives_9_1_0 ) ) )
            // InternalOCLinEcore.g:11393:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
            {
            // InternalOCLinEcore.g:11393:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
            // InternalOCLinEcore.g:11394:1: ( rule__OperationCS__Alternatives_9_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_9_1_0());
            }
            // InternalOCLinEcore.g:11395:1: ( rule__OperationCS__Alternatives_9_1_0 )
            // InternalOCLinEcore.g:11395: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:11405: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:11409:1: ( rule__OperationCS__Group_9_1__1__Impl )
            // InternalOCLinEcore.g:11410: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:11416: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:11420:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:11421:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:11421:1: ( ( ',' )? )
            // InternalOCLinEcore.g:11422:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());
            }
            // InternalOCLinEcore.g:11423:1: ( ',' )?
            int alt136=2;
            int LA136_0 = input.LA(1);

            if ( (LA136_0==99) ) {
                alt136=1;
            }
            switch (alt136) {
                case 1 :
                    // InternalOCLinEcore.g:11424:2: ','
                    {
                    match(input,99,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:11439: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:11443:1: ( rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 )
            // InternalOCLinEcore.g:11444:2: rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1
            {
            pushFollow(FollowSets000.FOLLOW_60);
            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:11451: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:11455:1: ( ( '{' ) )
            // InternalOCLinEcore.g:11456:1: ( '{' )
            {
            // InternalOCLinEcore.g:11456:1: ( '{' )
            // InternalOCLinEcore.g:11457:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());
            }
            match(input,100,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:11470: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:11474:1: ( rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 )
            // InternalOCLinEcore.g:11475:2: rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2
            {
            pushFollow(FollowSets000.FOLLOW_60);
            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:11482: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:11486:1: ( ( ( rule__OperationCS__Alternatives_10_0_1 )* ) )
            // InternalOCLinEcore.g:11487:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
            {
            // InternalOCLinEcore.g:11487:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
            // InternalOCLinEcore.g:11488:1: ( rule__OperationCS__Alternatives_10_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getAlternatives_10_0_1());
            }
            // InternalOCLinEcore.g:11489:1: ( rule__OperationCS__Alternatives_10_0_1 )*
            loop137:
            do {
                int alt137=2;
                int LA137_0 = input.LA(1);

                if ( (LA137_0==19||(LA137_0>=39 && LA137_0<=40)||(LA137_0>=54 && LA137_0<=55)||LA137_0==59) ) {
                    alt137=1;
                }


                switch (alt137) {
            	case 1 :
            	    // InternalOCLinEcore.g:11489:2: rule__OperationCS__Alternatives_10_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_61);
            	    rule__OperationCS__Alternatives_10_0_1();

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

            	    }
            	    break;

            	default :
            	    break loop137;
                }
            } 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:11499: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:11503:1: ( rule__OperationCS__Group_10_0__2__Impl )
            // InternalOCLinEcore.g:11504: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:11510: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:11514:1: ( ( '}' ) )
            // InternalOCLinEcore.g:11515:1: ( '}' )
            {
            // InternalOCLinEcore.g:11515:1: ( '}' )
            // InternalOCLinEcore.g:11516:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());
            }
            match(input,101,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:11535: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:11539:1: ( rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 )
            // InternalOCLinEcore.g:11540: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:11547: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:11551:1: ( ( 'body' ) )
            // InternalOCLinEcore.g:11552:1: ( 'body' )
            {
            // InternalOCLinEcore.g:11552:1: ( 'body' )
            // InternalOCLinEcore.g:11553: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:11566: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:11570:1: ( rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 )
            // InternalOCLinEcore.g:11571: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:11578: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:11582:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:11583:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:11583:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:11584:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_2_1());
            }
            // InternalOCLinEcore.g:11585:1: ( ruleUnrestrictedName )?
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( ((LA138_0>=RULE_SIMPLE_ID && LA138_0<=RULE_ESCAPED_ID)||(LA138_0>=17 && LA138_0<=51)||(LA138_0>=54 && LA138_0<=59)) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // InternalOCLinEcore.g:11585: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:11595: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:11599:1: ( rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 )
            // InternalOCLinEcore.g:11600: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:11607: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:11611:1: ( ( ':' ) )
            // InternalOCLinEcore.g:11612:1: ( ':' )
            {
            // InternalOCLinEcore.g:11612:1: ( ':' )
            // InternalOCLinEcore.g:11613:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2_2());
            }
            match(input,98,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:11626: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:11630:1: ( rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 )
            // InternalOCLinEcore.g:11631: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:11638: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:11642:1: ( ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:11643:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:11643:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
            // InternalOCLinEcore.g:11644:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsAssignment_10_0_1_2_3());
            }
            // InternalOCLinEcore.g:11645:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
            int alt139=2;
            int LA139_0 = input.LA(1);

            if ( ((LA139_0>=RULE_INT && LA139_0<=RULE_SINGLE_QUOTED_STRING)||(LA139_0>=RULE_SIMPLE_ID && LA139_0<=RULE_UNQUOTED_STRING)||(LA139_0>=17 && LA139_0<=51)||(LA139_0>=54 && LA139_0<=62)||(LA139_0>=79 && LA139_0<=93)||LA139_0==96||LA139_0==106||(LA139_0>=108 && LA139_0<=109)||LA139_0==114||(LA139_0>=119 && LA139_0<=120)||(LA139_0>=133 && LA139_0<=134)) ) {
                alt139=1;
            }
            switch (alt139) {
                case 1 :
                    // InternalOCLinEcore.g:11645: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:11655: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:11659:1: ( rule__OperationCS__Group_10_0_1_2__4__Impl )
            // InternalOCLinEcore.g:11660: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:11666: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:11670:1: ( ( ';' ) )
            // InternalOCLinEcore.g:11671:1: ( ';' )
            {
            // InternalOCLinEcore.g:11671:1: ( ';' )
            // InternalOCLinEcore.g:11672: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:11695: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:11699:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
            // InternalOCLinEcore.g:11700: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:11707:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
    public final void rule__PackageCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11711:1: ( ( 'package' ) )
            // InternalOCLinEcore.g:11712:1: ( 'package' )
            {
            // InternalOCLinEcore.g:11712:1: ( 'package' )
            // InternalOCLinEcore.g:11713: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:11726: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:11730:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
            // InternalOCLinEcore.g:11731: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:11738: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:11742:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
            // InternalOCLinEcore.g:11743:1: ( ( rule__PackageCS__NameAssignment_1 ) )
            {
            // InternalOCLinEcore.g:11743:1: ( ( rule__PackageCS__NameAssignment_1 ) )
            // InternalOCLinEcore.g:11744:1: ( rule__PackageCS__NameAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNameAssignment_1());
            }
            // InternalOCLinEcore.g:11745:1: ( rule__PackageCS__NameAssignment_1 )
            // InternalOCLinEcore.g:11745: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:11755: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:11759:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
            // InternalOCLinEcore.g:11760: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:11767: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:11771:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:11772:1: ( ( rule__PackageCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:11772:1: ( ( rule__PackageCS__Group_2__0 )? )
            // InternalOCLinEcore.g:11773:1: ( rule__PackageCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:11774:1: ( rule__PackageCS__Group_2__0 )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==98) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalOCLinEcore.g:11774: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:11784: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:11788:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
            // InternalOCLinEcore.g:11789: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:11796: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:11800:1: ( ( ( rule__PackageCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:11801:1: ( ( rule__PackageCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:11801:1: ( ( rule__PackageCS__Group_3__0 )? )
            // InternalOCLinEcore.g:11802:1: ( rule__PackageCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:11803:1: ( rule__PackageCS__Group_3__0 )?
            int alt141=2;
            int LA141_0 = input.LA(1);

            if ( (LA141_0==69) ) {
                alt141=1;
            }
            switch (alt141) {
                case 1 :
                    // InternalOCLinEcore.g:11803: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:11813: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:11817:1: ( rule__PackageCS__Group__4__Impl )
            // InternalOCLinEcore.g:11818: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:11824: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:11828:1: ( ( ( rule__PackageCS__Alternatives_4 ) ) )
            // InternalOCLinEcore.g:11829:1: ( ( rule__PackageCS__Alternatives_4 ) )
            {
            // InternalOCLinEcore.g:11829:1: ( ( rule__PackageCS__Alternatives_4 ) )
            // InternalOCLinEcore.g:11830:1: ( rule__PackageCS__Alternatives_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getAlternatives_4());
            }
            // InternalOCLinEcore.g:11831:1: ( rule__PackageCS__Alternatives_4 )
            // InternalOCLinEcore.g:11831: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:11851: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:11855:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
            // InternalOCLinEcore.g:11856: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:11863:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__PackageCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11867:1: ( ( ':' ) )
            // InternalOCLinEcore.g:11868:1: ( ':' )
            {
            // InternalOCLinEcore.g:11868:1: ( ':' )
            // InternalOCLinEcore.g:11869:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getColonKeyword_2_0());
            }
            match(input,98,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:11882: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:11886:1: ( rule__PackageCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:11887: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:11893: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:11897:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:11898:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:11898:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
            // InternalOCLinEcore.g:11899:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsPrefixAssignment_2_1());
            }
            // InternalOCLinEcore.g:11900:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
            // InternalOCLinEcore.g:11900: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:11914: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:11918:1: ( rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 )
            // InternalOCLinEcore.g:11919: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:11926:1: rule__PackageCS__Group_3__0__Impl : ( '=' ) ;
    public final void rule__PackageCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:11930:1: ( ( '=' ) )
            // InternalOCLinEcore.g:11931:1: ( '=' )
            {
            // InternalOCLinEcore.g:11931:1: ( '=' )
            // InternalOCLinEcore.g:11932:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getEqualsSignKeyword_3_0());
            }
            match(input,69,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:11945: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:11949:1: ( rule__PackageCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:11950: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:11956: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:11960:1: ( ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:11961:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:11961:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
            // InternalOCLinEcore.g:11962:1: ( rule__PackageCS__NsURIAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getNsURIAssignment_3_1());
            }
            // InternalOCLinEcore.g:11963:1: ( rule__PackageCS__NsURIAssignment_3_1 )
            // InternalOCLinEcore.g:11963: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:11977: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:11981:1: ( rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 )
            // InternalOCLinEcore.g:11982:2: rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1
            {
            pushFollow(FollowSets000.FOLLOW_62);
            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:11989: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:11993:1: ( ( '{' ) )
            // InternalOCLinEcore.g:11994:1: ( '{' )
            {
            // InternalOCLinEcore.g:11994:1: ( '{' )
            // InternalOCLinEcore.g:11995:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_4_0_0());
            }
            match(input,100,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:12008: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:12012:1: ( rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 )
            // InternalOCLinEcore.g:12013:2: rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2
            {
            pushFollow(FollowSets000.FOLLOW_62);
            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:12020: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:12024:1: ( ( ( rule__PackageCS__Alternatives_4_0_1 )* ) )
            // InternalOCLinEcore.g:12025:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
            {
            // InternalOCLinEcore.g:12025:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
            // InternalOCLinEcore.g:12026:1: ( rule__PackageCS__Alternatives_4_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getAlternatives_4_0_1());
            }
            // InternalOCLinEcore.g:12027:1: ( rule__PackageCS__Alternatives_4_0_1 )*
            loop142:
            do {
                int alt142=2;
                int LA142_0 = input.LA(1);

                if ( (LA142_0==17||LA142_0==21||LA142_0==23||LA142_0==27||LA142_0==38||LA142_0==41||(LA142_0>=54 && LA142_0<=55)||LA142_0==59) ) {
                    alt142=1;
                }


                switch (alt142) {
            	case 1 :
            	    // InternalOCLinEcore.g:12027:2: rule__PackageCS__Alternatives_4_0_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_63);
            	    rule__PackageCS__Alternatives_4_0_1();

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

            	    }
            	    break;

            	default :
            	    break loop142;
                }
            } 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:12037: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:12041:1: ( rule__PackageCS__Group_4_0__2__Impl )
            // InternalOCLinEcore.g:12042: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:12048: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:12052:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12053:1: ( '}' )
            {
            // InternalOCLinEcore.g:12053:1: ( '}' )
            // InternalOCLinEcore.g:12054:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4_0_2());
            }
            match(input,101,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:12073: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:12077:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
            // InternalOCLinEcore.g:12078:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_64);
            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:12085: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:12089:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:12090:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:12090:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:12091:1: ( rule__ParameterCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:12092:1: ( rule__ParameterCS__NameAssignment_0 )
            // InternalOCLinEcore.g:12092: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:12102: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:12106:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
            // InternalOCLinEcore.g:12107:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_64);
            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:12114: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:12118:1: ( ( ( rule__ParameterCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:12119:1: ( ( rule__ParameterCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:12119:1: ( ( rule__ParameterCS__Group_1__0 )? )
            // InternalOCLinEcore.g:12120:1: ( rule__ParameterCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:12121:1: ( rule__ParameterCS__Group_1__0 )?
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==98) ) {
                alt143=1;
            }
            switch (alt143) {
                case 1 :
                    // InternalOCLinEcore.g:12121: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:12131: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:12135:1: ( rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 )
            // InternalOCLinEcore.g:12136:2: rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_64);
            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:12143: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:12147:1: ( ( ( rule__ParameterCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:12148:1: ( ( rule__ParameterCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:12148:1: ( ( rule__ParameterCS__Group_2__0 )? )
            // InternalOCLinEcore.g:12149:1: ( rule__ParameterCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:12150:1: ( rule__ParameterCS__Group_2__0 )?
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( (LA144_0==100) ) {
                int LA144_1 = input.LA(2);

                if ( (LA144_1==37||LA144_1==49||LA144_1==124||LA144_1==127) ) {
                    alt144=1;
                }
            }
            switch (alt144) {
                case 1 :
                    // InternalOCLinEcore.g:12150: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:12160: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:12164:1: ( rule__ParameterCS__Group__3__Impl )
            // InternalOCLinEcore.g:12165: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:12171: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:12175:1: ( ( ( rule__ParameterCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:12176:1: ( ( rule__ParameterCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:12176:1: ( ( rule__ParameterCS__Group_3__0 )? )
            // InternalOCLinEcore.g:12177:1: ( rule__ParameterCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:12178:1: ( rule__ParameterCS__Group_3__0 )?
            int alt145=2;
            int LA145_0 = input.LA(1);

            if ( (LA145_0==100) ) {
                alt145=1;
            }
            switch (alt145) {
                case 1 :
                    // InternalOCLinEcore.g:12178: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:12196: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:12200:1: ( rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 )
            // InternalOCLinEcore.g:12201: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:12208:1: rule__ParameterCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__ParameterCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12212:1: ( ( ':' ) )
            // InternalOCLinEcore.g:12213:1: ( ':' )
            {
            // InternalOCLinEcore.g:12213:1: ( ':' )
            // InternalOCLinEcore.g:12214:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getColonKeyword_1_0());
            }
            match(input,98,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:12227: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:12231:1: ( rule__ParameterCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:12232: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:12238: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:12242:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:12243:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:12243:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:12244:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:12245:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:12245: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:12259: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:12263:1: ( rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 )
            // InternalOCLinEcore.g:12264:2: rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1
            {
            pushFollow(FollowSets000.FOLLOW_65);
            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:12271:1: rule__ParameterCS__Group_2__0__Impl : ( '{' ) ;
    public final void rule__ParameterCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12275:1: ( ( '{' ) )
            // InternalOCLinEcore.g:12276:1: ( '{' )
            {
            // InternalOCLinEcore.g:12276:1: ( '{' )
            // InternalOCLinEcore.g:12277:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());
            }
            match(input,100,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:12290: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:12294:1: ( rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 )
            // InternalOCLinEcore.g:12295: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:12302: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:12306:1: ( ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) )
            // InternalOCLinEcore.g:12307:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
            {
            // InternalOCLinEcore.g:12307:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:12308:1: ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:12308:1: ( ( rule__ParameterCS__Group_2_1__0 ) )
            // InternalOCLinEcore.g:12309:1: ( rule__ParameterCS__Group_2_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:12310:1: ( rule__ParameterCS__Group_2_1__0 )
            // InternalOCLinEcore.g:12310:2: rule__ParameterCS__Group_2_1__0
            {
            pushFollow(FollowSets000.FOLLOW_66);
            rule__ParameterCS__Group_2_1__0();

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

            }

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

            }

            // InternalOCLinEcore.g:12313:1: ( ( rule__ParameterCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:12314:1: ( rule__ParameterCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:12315:1: ( rule__ParameterCS__Group_2_1__0 )*
            loop146:
            do {
                int alt146=2;
                int LA146_0 = input.LA(1);

                if ( (LA146_0==37||LA146_0==49||LA146_0==124||LA146_0==127) ) {
                    alt146=1;
                }


                switch (alt146) {
            	case 1 :
            	    // InternalOCLinEcore.g:12315:2: rule__ParameterCS__Group_2_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_66);
            	    rule__ParameterCS__Group_2_1__0();

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

            	    }
            	    break;

            	default :
            	    break loop146;
                }
            } 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:12326: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:12330:1: ( rule__ParameterCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:12331: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:12337:1: rule__ParameterCS__Group_2__2__Impl : ( '}' ) ;
    public final void rule__ParameterCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12341:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12342:1: ( '}' )
            {
            // InternalOCLinEcore.g:12342:1: ( '}' )
            // InternalOCLinEcore.g:12343:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());
            }
            match(input,101,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:12362: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:12366:1: ( rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 )
            // InternalOCLinEcore.g:12367: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:12374: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:12378:1: ( ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) )
            // InternalOCLinEcore.g:12379:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
            {
            // InternalOCLinEcore.g:12379:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
            // InternalOCLinEcore.g:12380:1: ( rule__ParameterCS__Alternatives_2_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getAlternatives_2_1_0());
            }
            // InternalOCLinEcore.g:12381:1: ( rule__ParameterCS__Alternatives_2_1_0 )
            // InternalOCLinEcore.g:12381: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:12391: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:12395:1: ( rule__ParameterCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:12396: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:12402: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:12406:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:12407:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:12407:1: ( ( ',' )? )
            // InternalOCLinEcore.g:12408:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());
            }
            // InternalOCLinEcore.g:12409:1: ( ',' )?
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==99) ) {
                alt147=1;
            }
            switch (alt147) {
                case 1 :
                    // InternalOCLinEcore.g:12410:2: ','
                    {
                    match(input,99,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:12425: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:12429:1: ( rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 )
            // InternalOCLinEcore.g:12430:2: rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1
            {
            pushFollow(FollowSets000.FOLLOW_49);
            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:12437:1: rule__ParameterCS__Group_3__0__Impl : ( '{' ) ;
    public final void rule__ParameterCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12441:1: ( ( '{' ) )
            // InternalOCLinEcore.g:12442:1: ( '{' )
            {
            // InternalOCLinEcore.g:12442:1: ( '{' )
            // InternalOCLinEcore.g:12443:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());
            }
            match(input,100,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:12456: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:12460:1: ( rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 )
            // InternalOCLinEcore.g:12461:2: rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2
            {
            pushFollow(FollowSets000.FOLLOW_49);
            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:12468: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:12472:1: ( ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) )
            // InternalOCLinEcore.g:12473:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
            {
            // InternalOCLinEcore.g:12473:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
            // InternalOCLinEcore.g:12474:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAssignment_3_1());
            }
            // InternalOCLinEcore.g:12475:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
            loop148:
            do {
                int alt148=2;
                int LA148_0 = input.LA(1);

                if ( ((LA148_0>=54 && LA148_0<=55)||LA148_0==59) ) {
                    alt148=1;
                }


                switch (alt148) {
            	case 1 :
            	    // InternalOCLinEcore.g:12475:2: rule__ParameterCS__OwnedAnnotationsAssignment_3_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_50);
            	    rule__ParameterCS__OwnedAnnotationsAssignment_3_1();

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

            	    }
            	    break;

            	default :
            	    break loop148;
                }
            } 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:12485: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:12489:1: ( rule__ParameterCS__Group_3__2__Impl )
            // InternalOCLinEcore.g:12490: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:12496:1: rule__ParameterCS__Group_3__2__Impl : ( '}' ) ;
    public final void rule__ParameterCS__Group_3__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12500:1: ( ( '}' ) )
            // InternalOCLinEcore.g:12501:1: ( '}' )
            {
            // InternalOCLinEcore.g:12501:1: ( '}' )
            // InternalOCLinEcore.g:12502:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_2());
            }
            match(input,101,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__ReferenceCS__Group__0"
    // InternalOCLinEcore.g:12521: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:12525:1: ( rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 )
            // InternalOCLinEcore.g:12526: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:12533: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:12537:1: ( ( ( rule__ReferenceCS__Alternatives_0 )? ) )
            // InternalOCLinEcore.g:12538:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
            {
            // InternalOCLinEcore.g:12538:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
            // InternalOCLinEcore.g:12539:1: ( rule__ReferenceCS__Alternatives_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:12540:1: ( rule__ReferenceCS__Alternatives_0 )?
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==24||LA149_0==46) ) {
                alt149=1;
            }
            switch (alt149) {
                case 1 :
                    // InternalOCLinEcore.g:12540: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:12550: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:12554:1: ( rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 )
            // InternalOCLinEcore.g:12555: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:12562:1: rule__ReferenceCS__Group__1__Impl : ( 'property' ) ;
    public final void rule__ReferenceCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12566:1: ( ( 'property' ) )
            // InternalOCLinEcore.g:12567:1: ( 'property' )
            {
            // InternalOCLinEcore.g:12567:1: ( 'property' )
            // InternalOCLinEcore.g:12568: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:12581: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:12585:1: ( rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 )
            // InternalOCLinEcore.g:12586: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:12593: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:12597:1: ( ( ( rule__ReferenceCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:12598:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:12598:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:12599:1: ( rule__ReferenceCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:12600:1: ( rule__ReferenceCS__NameAssignment_2 )
            // InternalOCLinEcore.g:12600: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:12610: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:12614:1: ( rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 )
            // InternalOCLinEcore.g:12615: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:12622: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:12626:1: ( ( ( rule__ReferenceCS__Group_3__0 )? ) )
            // InternalOCLinEcore.g:12627:1: ( ( rule__ReferenceCS__Group_3__0 )? )
            {
            // InternalOCLinEcore.g:12627:1: ( ( rule__ReferenceCS__Group_3__0 )? )
            // InternalOCLinEcore.g:12628:1: ( rule__ReferenceCS__Group_3__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:12629:1: ( rule__ReferenceCS__Group_3__0 )?
            int alt150=2;
            int LA150_0 = input.LA(1);

            if ( (LA150_0==102) ) {
                alt150=1;
            }
            switch (alt150) {
                case 1 :
                    // InternalOCLinEcore.g:12629: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:12639: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:12643:1: ( rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 )
            // InternalOCLinEcore.g:12644: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:12651: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:12655:1: ( ( ( rule__ReferenceCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:12656:1: ( ( rule__ReferenceCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:12656:1: ( ( rule__ReferenceCS__Group_4__0 )? )
            // InternalOCLinEcore.g:12657:1: ( rule__ReferenceCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:12658:1: ( rule__ReferenceCS__Group_4__0 )?
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==98) ) {
                alt151=1;
            }
            switch (alt151) {
                case 1 :
                    // InternalOCLinEcore.g:12658: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:12668: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:12672:1: ( rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 )
            // InternalOCLinEcore.g:12673: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:12680: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:12684:1: ( ( ( rule__ReferenceCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:12685:1: ( ( rule__ReferenceCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:12685:1: ( ( rule__ReferenceCS__Group_5__0 )? )
            // InternalOCLinEcore.g:12686:1: ( rule__ReferenceCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:12687:1: ( rule__ReferenceCS__Group_5__0 )?
            int alt152=2;
            int LA152_0 = input.LA(1);

            if ( (LA152_0==69) ) {
                alt152=1;
            }
            switch (alt152) {
                case 1 :
                    // InternalOCLinEcore.g:12687: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:12697: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:12701:1: ( rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 )
            // InternalOCLinEcore.g:12702: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:12709: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:12713:1: ( ( ( rule__ReferenceCS__Group_6__0 )? ) )
            // InternalOCLinEcore.g:12714:1: ( ( rule__ReferenceCS__Group_6__0 )? )
            {
            // InternalOCLinEcore.g:12714:1: ( ( rule__ReferenceCS__Group_6__0 )? )
            // InternalOCLinEcore.g:12715:1: ( rule__ReferenceCS__Group_6__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6());
            }
            // InternalOCLinEcore.g:12716:1: ( rule__ReferenceCS__Group_6__0 )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==100) ) {
                int LA153_1 = input.LA(2);

                if ( (LA153_1==22||LA153_1==26||LA153_1==37||LA153_1==43||LA153_1==45||(LA153_1>=48 && LA153_1<=51)||LA153_1==122||(LA153_1>=124 && LA153_1<=129)||(LA153_1>=131 && LA153_1<=132)) ) {
                    alt153=1;
                }
            }
            switch (alt153) {
                case 1 :
                    // InternalOCLinEcore.g:12716: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:12726: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:12730:1: ( rule__ReferenceCS__Group__7__Impl )
            // InternalOCLinEcore.g:12731: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:12737: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:12741:1: ( ( ( rule__ReferenceCS__Alternatives_7 ) ) )
            // InternalOCLinEcore.g:12742:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
            {
            // InternalOCLinEcore.g:12742:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
            // InternalOCLinEcore.g:12743:1: ( rule__ReferenceCS__Alternatives_7 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_7());
            }
            // InternalOCLinEcore.g:12744:1: ( rule__ReferenceCS__Alternatives_7 )
            // InternalOCLinEcore.g:12744: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:12770: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:12774:1: ( rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 )
            // InternalOCLinEcore.g:12775: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:12782: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:12786:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) )
            // InternalOCLinEcore.g:12787:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
            {
            // InternalOCLinEcore.g:12787:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
            // InternalOCLinEcore.g:12788:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_0());
            }
            // InternalOCLinEcore.g:12789:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
            // InternalOCLinEcore.g:12789: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:12799: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:12803:1: ( rule__ReferenceCS__Group_0_0__1__Impl )
            // InternalOCLinEcore.g:12804: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:12810: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:12814:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) )
            // InternalOCLinEcore.g:12815:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
            {
            // InternalOCLinEcore.g:12815:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
            // InternalOCLinEcore.g:12816:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_1());
            }
            // InternalOCLinEcore.g:12817:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==24) ) {
                alt154=1;
            }
            switch (alt154) {
                case 1 :
                    // InternalOCLinEcore.g:12817: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:12831: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:12835:1: ( rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 )
            // InternalOCLinEcore.g:12836: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:12843: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:12847:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) )
            // InternalOCLinEcore.g:12848:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
            {
            // InternalOCLinEcore.g:12848:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
            // InternalOCLinEcore.g:12849:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_0());
            }
            // InternalOCLinEcore.g:12850:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
            // InternalOCLinEcore.g:12850: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:12860: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:12864:1: ( rule__ReferenceCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:12865: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:12871: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:12875:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) )
            // InternalOCLinEcore.g:12876:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
            {
            // InternalOCLinEcore.g:12876:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
            // InternalOCLinEcore.g:12877:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:12878:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
            int alt155=2;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==46) ) {
                alt155=1;
            }
            switch (alt155) {
                case 1 :
                    // InternalOCLinEcore.g:12878: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:12892: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:12896:1: ( rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 )
            // InternalOCLinEcore.g:12897: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:12904:1: rule__ReferenceCS__Group_3__0__Impl : ( '#' ) ;
    public final void rule__ReferenceCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12908:1: ( ( '#' ) )
            // InternalOCLinEcore.g:12909:1: ( '#' )
            {
            // InternalOCLinEcore.g:12909:1: ( '#' )
            // InternalOCLinEcore.g:12910:1: '#'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());
            }
            match(input,102,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:12923: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:12927:1: ( rule__ReferenceCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:12928: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:12934: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:12938:1: ( ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:12939:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:12939:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
            // InternalOCLinEcore.g:12940:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredOppositeAssignment_3_1());
            }
            // InternalOCLinEcore.g:12941:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
            // InternalOCLinEcore.g:12941: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:12955: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:12959:1: ( rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 )
            // InternalOCLinEcore.g:12960: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:12967:1: rule__ReferenceCS__Group_4__0__Impl : ( ':' ) ;
    public final void rule__ReferenceCS__Group_4__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:12971:1: ( ( ':' ) )
            // InternalOCLinEcore.g:12972:1: ( ':' )
            {
            // InternalOCLinEcore.g:12972:1: ( ':' )
            // InternalOCLinEcore.g:12973:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());
            }
            match(input,98,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:12986: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:12990:1: ( rule__ReferenceCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:12991: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:12997: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:13001:1: ( ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:13002:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:13002:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
            // InternalOCLinEcore.g:13003:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedTypeAssignment_4_1());
            }
            // InternalOCLinEcore.g:13004:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
            // InternalOCLinEcore.g:13004: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:13018: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:13022:1: ( rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 )
            // InternalOCLinEcore.g:13023: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:13030:1: rule__ReferenceCS__Group_5__0__Impl : ( '=' ) ;
    public final void rule__ReferenceCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13034:1: ( ( '=' ) )
            // InternalOCLinEcore.g:13035:1: ( '=' )
            {
            // InternalOCLinEcore.g:13035:1: ( '=' )
            // InternalOCLinEcore.g:13036:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());
            }
            match(input,69,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:13049: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:13053:1: ( rule__ReferenceCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:13054: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:13060: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:13064:1: ( ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) )
            // InternalOCLinEcore.g:13065:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
            {
            // InternalOCLinEcore.g:13065:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
            // InternalOCLinEcore.g:13066:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getDefaultAssignment_5_1());
            }
            // InternalOCLinEcore.g:13067:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
            // InternalOCLinEcore.g:13067: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:13081: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:13085:1: ( rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 )
            // InternalOCLinEcore.g:13086: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:13093:1: rule__ReferenceCS__Group_6__0__Impl : ( '{' ) ;
    public final void rule__ReferenceCS__Group_6__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13097:1: ( ( '{' ) )
            // InternalOCLinEcore.g:13098:1: ( '{' )
            {
            // InternalOCLinEcore.g:13098:1: ( '{' )
            // InternalOCLinEcore.g:13099:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());
            }
            match(input,100,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:13112: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:13116:1: ( rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 )
            // InternalOCLinEcore.g:13117: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:13124: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:13128:1: ( ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) )
            // InternalOCLinEcore.g:13129:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
            {
            // InternalOCLinEcore.g:13129:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
            // InternalOCLinEcore.g:13130:1: ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* )
            {
            // InternalOCLinEcore.g:13130:1: ( ( rule__ReferenceCS__Group_6_1__0 ) )
            // InternalOCLinEcore.g:13131:1: ( rule__ReferenceCS__Group_6_1__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }
            // InternalOCLinEcore.g:13132:1: ( rule__ReferenceCS__Group_6_1__0 )
            // InternalOCLinEcore.g:13132: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:13135:1: ( ( rule__ReferenceCS__Group_6_1__0 )* )
            // InternalOCLinEcore.g:13136:1: ( rule__ReferenceCS__Group_6_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
            }
            // InternalOCLinEcore.g:13137:1: ( rule__ReferenceCS__Group_6_1__0 )*
            loop156:
            do {
                int alt156=2;
                int LA156_0 = input.LA(1);

                if ( (LA156_0==22||LA156_0==26||LA156_0==37||LA156_0==43||LA156_0==45||(LA156_0>=48 && LA156_0<=51)||LA156_0==122||(LA156_0>=124 && LA156_0<=129)||(LA156_0>=131 && LA156_0<=132)) ) {
                    alt156=1;
                }


                switch (alt156) {
            	case 1 :
            	    // InternalOCLinEcore.g:13137: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 loop156;
                }
            } 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:13148: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:13152:1: ( rule__ReferenceCS__Group_6__2__Impl )
            // InternalOCLinEcore.g:13153: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:13159:1: rule__ReferenceCS__Group_6__2__Impl : ( '}' ) ;
    public final void rule__ReferenceCS__Group_6__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13163:1: ( ( '}' ) )
            // InternalOCLinEcore.g:13164:1: ( '}' )
            {
            // InternalOCLinEcore.g:13164:1: ( '}' )
            // InternalOCLinEcore.g:13165:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());
            }
            match(input,101,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:13184: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:13188:1: ( rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 )
            // InternalOCLinEcore.g:13189: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:13196: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:13200:1: ( ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) )
            // InternalOCLinEcore.g:13201:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
            {
            // InternalOCLinEcore.g:13201:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
            // InternalOCLinEcore.g:13202:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_6_1_0());
            }
            // InternalOCLinEcore.g:13203:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
            // InternalOCLinEcore.g:13203: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:13213: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:13217:1: ( rule__ReferenceCS__Group_6_1__1__Impl )
            // InternalOCLinEcore.g:13218: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:13224: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:13228:1: ( ( ( ',' )? ) )
            // InternalOCLinEcore.g:13229:1: ( ( ',' )? )
            {
            // InternalOCLinEcore.g:13229:1: ( ( ',' )? )
            // InternalOCLinEcore.g:13230:1: ( ',' )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());
            }
            // InternalOCLinEcore.g:13231:1: ( ',' )?
            int alt157=2;
            int LA157_0 = input.LA(1);

            if ( (LA157_0==99) ) {
                alt157=1;
            }
            switch (alt157) {
                case 1 :
                    // InternalOCLinEcore.g:13232:2: ','
                    {
                    match(input,99,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:13247: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:13251:1: ( rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 )
            // InternalOCLinEcore.g:13252: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:13259: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:13263:1: ( ( '{' ) )
            // InternalOCLinEcore.g:13264:1: ( '{' )
            {
            // InternalOCLinEcore.g:13264:1: ( '{' )
            // InternalOCLinEcore.g:13265:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }
            match(input,100,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:13278: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:13282:1: ( rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 )
            // InternalOCLinEcore.g:13283: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:13290: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:13294:1: ( ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) )
            // InternalOCLinEcore.g:13295:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
            {
            // InternalOCLinEcore.g:13295:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
            // InternalOCLinEcore.g:13296:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getAlternatives_7_0_1());
            }
            // InternalOCLinEcore.g:13297:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
            loop158:
            do {
                int alt158=2;
                int LA158_0 = input.LA(1);

                if ( (LA158_0==25||LA158_0==31||LA158_0==33||(LA158_0>=54 && LA158_0<=55)||LA158_0==59) ) {
                    alt158=1;
                }


                switch (alt158) {
            	case 1 :
            	    // InternalOCLinEcore.g:13297: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 loop158;
                }
            } 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:13307: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:13311:1: ( rule__ReferenceCS__Group_7_0__2__Impl )
            // InternalOCLinEcore.g:13312: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:13318: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:13322:1: ( ( '}' ) )
            // InternalOCLinEcore.g:13323:1: ( '}' )
            {
            // InternalOCLinEcore.g:13323:1: ( '}' )
            // InternalOCLinEcore.g:13324:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }
            match(input,101,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:13343: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:13347:1: ( rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 )
            // InternalOCLinEcore.g:13348: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:13355: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:13359:1: ( ( 'key' ) )
            // InternalOCLinEcore.g:13360:1: ( 'key' )
            {
            // InternalOCLinEcore.g:13360:1: ( 'key' )
            // InternalOCLinEcore.g:13361: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:13374: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:13378:1: ( rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 )
            // InternalOCLinEcore.g:13379: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:13386: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:13390:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) )
            // InternalOCLinEcore.g:13391:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
            {
            // InternalOCLinEcore.g:13391:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
            // InternalOCLinEcore.g:13392:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_1());
            }
            // InternalOCLinEcore.g:13393:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
            // InternalOCLinEcore.g:13393: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:13403: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:13407:1: ( rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 )
            // InternalOCLinEcore.g:13408: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:13415: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:13419:1: ( ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) )
            // InternalOCLinEcore.g:13420:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
            {
            // InternalOCLinEcore.g:13420:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
            // InternalOCLinEcore.g:13421: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:13422:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
            loop159:
            do {
                int alt159=2;
                int LA159_0 = input.LA(1);

                if ( (LA159_0==99) ) {
                    alt159=1;
                }


                switch (alt159) {
            	case 1 :
            	    // InternalOCLinEcore.g:13422: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 loop159;
                }
            } 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:13432: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:13436:1: ( rule__ReferenceCS__Group_7_0_1_1__3__Impl )
            // InternalOCLinEcore.g:13437: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:13443: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:13447:1: ( ( ';' ) )
            // InternalOCLinEcore.g:13448:1: ( ';' )
            {
            // InternalOCLinEcore.g:13448:1: ( ';' )
            // InternalOCLinEcore.g:13449: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:13470: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:13474:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 )
            // InternalOCLinEcore.g:13475: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:13482: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:13486:1: ( ( ',' ) )
            // InternalOCLinEcore.g:13487:1: ( ',' )
            {
            // InternalOCLinEcore.g:13487:1: ( ',' )
            // InternalOCLinEcore.g:13488:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getCommaKeyword_7_0_1_1_2_0());
            }
            match(input,99,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:13501: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:13505:1: ( rule__ReferenceCS__Group_7_0_1_1_2__1__Impl )
            // InternalOCLinEcore.g:13506: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:13512: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:13516:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) )
            // InternalOCLinEcore.g:13517:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
            {
            // InternalOCLinEcore.g:13517:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
            // InternalOCLinEcore.g:13518: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:13519:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
            // InternalOCLinEcore.g:13519: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:13533: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:13537:1: ( rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 )
            // InternalOCLinEcore.g:13538: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:13545: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:13549:1: ( ( 'initial' ) )
            // InternalOCLinEcore.g:13550:1: ( 'initial' )
            {
            // InternalOCLinEcore.g:13550:1: ( 'initial' )
            // InternalOCLinEcore.g:13551: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:13564: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:13568:1: ( rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 )
            // InternalOCLinEcore.g:13569: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:13576: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:13580:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:13581:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:13581:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:13582:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_2_1());
            }
            // InternalOCLinEcore.g:13583:1: ( ruleUnrestrictedName )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( ((LA160_0>=RULE_SIMPLE_ID && LA160_0<=RULE_ESCAPED_ID)||(LA160_0>=17 && LA160_0<=51)||(LA160_0>=54 && LA160_0<=59)) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // InternalOCLinEcore.g:13583: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:13593: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:13597:1: ( rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 )
            // InternalOCLinEcore.g:13598: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:13605: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:13609:1: ( ( ':' ) )
            // InternalOCLinEcore.g:13610:1: ( ':' )
            {
            // InternalOCLinEcore.g:13610:1: ( ':' )
            // InternalOCLinEcore.g:13611:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_2_2());
            }
            match(input,98,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:13624: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:13628:1: ( rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 )
            // InternalOCLinEcore.g:13629: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:13636: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:13640:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) )
            // InternalOCLinEcore.g:13641:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
            {
            // InternalOCLinEcore.g:13641:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
            // InternalOCLinEcore.g:13642:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_2_3());
            }
            // InternalOCLinEcore.g:13643:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( ((LA161_0>=RULE_INT && LA161_0<=RULE_SINGLE_QUOTED_STRING)||(LA161_0>=RULE_SIMPLE_ID && LA161_0<=RULE_UNQUOTED_STRING)||(LA161_0>=17 && LA161_0<=51)||(LA161_0>=54 && LA161_0<=62)||(LA161_0>=79 && LA161_0<=93)||LA161_0==96||LA161_0==106||(LA161_0>=108 && LA161_0<=109)||LA161_0==114||(LA161_0>=119 && LA161_0<=120)||(LA161_0>=133 && LA161_0<=134)) ) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // InternalOCLinEcore.g:13643: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:13653: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:13657:1: ( rule__ReferenceCS__Group_7_0_1_2__4__Impl )
            // InternalOCLinEcore.g:13658: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:13664: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:13668:1: ( ( ';' ) )
            // InternalOCLinEcore.g:13669:1: ( ';' )
            {
            // InternalOCLinEcore.g:13669:1: ( ';' )
            // InternalOCLinEcore.g:13670: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:13693: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:13697:1: ( rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 )
            // InternalOCLinEcore.g:13698: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:13705: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:13709:1: ( ( 'derivation' ) )
            // InternalOCLinEcore.g:13710:1: ( 'derivation' )
            {
            // InternalOCLinEcore.g:13710:1: ( 'derivation' )
            // InternalOCLinEcore.g:13711: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:13724: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:13728:1: ( rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 )
            // InternalOCLinEcore.g:13729: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:13736: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:13740:1: ( ( ( ruleUnrestrictedName )? ) )
            // InternalOCLinEcore.g:13741:1: ( ( ruleUnrestrictedName )? )
            {
            // InternalOCLinEcore.g:13741:1: ( ( ruleUnrestrictedName )? )
            // InternalOCLinEcore.g:13742:1: ( ruleUnrestrictedName )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_3_1());
            }
            // InternalOCLinEcore.g:13743:1: ( ruleUnrestrictedName )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( ((LA162_0>=RULE_SIMPLE_ID && LA162_0<=RULE_ESCAPED_ID)||(LA162_0>=17 && LA162_0<=51)||(LA162_0>=54 && LA162_0<=59)) ) {
                alt162=1;
            }
            switch (alt162) {
                case 1 :
                    // InternalOCLinEcore.g:13743: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:13753: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:13757:1: ( rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 )
            // InternalOCLinEcore.g:13758: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:13765: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:13769:1: ( ( ':' ) )
            // InternalOCLinEcore.g:13770:1: ( ':' )
            {
            // InternalOCLinEcore.g:13770:1: ( ':' )
            // InternalOCLinEcore.g:13771:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_3_2());
            }
            match(input,98,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:13784: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:13788:1: ( rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 )
            // InternalOCLinEcore.g:13789: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:13796: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:13800:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) )
            // InternalOCLinEcore.g:13801:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
            {
            // InternalOCLinEcore.g:13801:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
            // InternalOCLinEcore.g:13802:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_3_3());
            }
            // InternalOCLinEcore.g:13803:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( ((LA163_0>=RULE_INT && LA163_0<=RULE_SINGLE_QUOTED_STRING)||(LA163_0>=RULE_SIMPLE_ID && LA163_0<=RULE_UNQUOTED_STRING)||(LA163_0>=17 && LA163_0<=51)||(LA163_0>=54 && LA163_0<=62)||(LA163_0>=79 && LA163_0<=93)||LA163_0==96||LA163_0==106||(LA163_0>=108 && LA163_0<=109)||LA163_0==114||(LA163_0>=119 && LA163_0<=120)||(LA163_0>=133 && LA163_0<=134)) ) {
                alt163=1;
            }
            switch (alt163) {
                case 1 :
                    // InternalOCLinEcore.g:13803: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:13813: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:13817:1: ( rule__ReferenceCS__Group_7_0_1_3__4__Impl )
            // InternalOCLinEcore.g:13818: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:13824: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:13828:1: ( ( ';' ) )
            // InternalOCLinEcore.g:13829:1: ( ';' )
            {
            // InternalOCLinEcore.g:13829:1: ( ';' )
            // InternalOCLinEcore.g:13830: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__StructuredClassCS__Group__0"
    // InternalOCLinEcore.g:13853: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:13857:1: ( rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 )
            // InternalOCLinEcore.g:13858: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:13865: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:13869:1: ( ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) )
            // InternalOCLinEcore.g:13870:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
            {
            // InternalOCLinEcore.g:13870:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
            // InternalOCLinEcore.g:13871:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAssignment_0());
            }
            // InternalOCLinEcore.g:13872:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
            int alt164=2;
            int LA164_0 = input.LA(1);

            if ( (LA164_0==17) ) {
                alt164=1;
            }
            switch (alt164) {
                case 1 :
                    // InternalOCLinEcore.g:13872: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:13882: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:13886:1: ( rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 )
            // InternalOCLinEcore.g:13887: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:13894:1: rule__StructuredClassCS__Group__1__Impl : ( 'class' ) ;
    public final void rule__StructuredClassCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:13898:1: ( ( 'class' ) )
            // InternalOCLinEcore.g:13899:1: ( 'class' )
            {
            // InternalOCLinEcore.g:13899:1: ( 'class' )
            // InternalOCLinEcore.g:13900: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:13913: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:13917:1: ( rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 )
            // InternalOCLinEcore.g:13918: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:13925: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:13929:1: ( ( ( rule__StructuredClassCS__NameAssignment_2 ) ) )
            // InternalOCLinEcore.g:13930:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
            {
            // InternalOCLinEcore.g:13930:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
            // InternalOCLinEcore.g:13931:1: ( rule__StructuredClassCS__NameAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getNameAssignment_2());
            }
            // InternalOCLinEcore.g:13932:1: ( rule__StructuredClassCS__NameAssignment_2 )
            // InternalOCLinEcore.g:13932: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:13942: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:13946:1: ( rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 )
            // InternalOCLinEcore.g:13947: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:13954: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:13958:1: ( ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) )
            // InternalOCLinEcore.g:13959:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
            {
            // InternalOCLinEcore.g:13959:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
            // InternalOCLinEcore.g:13960:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureAssignment_3());
            }
            // InternalOCLinEcore.g:13961:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( (LA165_0==66||LA165_0==96) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // InternalOCLinEcore.g:13961: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:13971: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:13975:1: ( rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 )
            // InternalOCLinEcore.g:13976: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:13983: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:13987:1: ( ( ( rule__StructuredClassCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:13988:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:13988:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
            // InternalOCLinEcore.g:13989:1: ( rule__StructuredClassCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:13990:1: ( rule__StructuredClassCS__Group_4__0 )?
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( (LA166_0==28) ) {
                alt166=1;
            }
            switch (alt166) {
                case 1 :
                    // InternalOCLinEcore.g:13990: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:14000: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:14004:1: ( rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 )
            // InternalOCLinEcore.g:14005: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:14012: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:14016:1: ( ( ( rule__StructuredClassCS__Group_5__0 )? ) )
            // InternalOCLinEcore.g:14017:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
            {
            // InternalOCLinEcore.g:14017:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
            // InternalOCLinEcore.g:14018:1: ( rule__StructuredClassCS__Group_5__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_5());
            }
            // InternalOCLinEcore.g:14019:1: ( rule__StructuredClassCS__Group_5__0 )?
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==98) ) {
                alt167=1;
            }
            switch (alt167) {
                case 1 :
                    // InternalOCLinEcore.g:14019: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:14029: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:14033:1: ( rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 )
            // InternalOCLinEcore.g:14034: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:14041: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:14045:1: ( ( ( rule__StructuredClassCS__Group_6__0 )? ) )
            // InternalOCLinEcore.g:14046:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
            {
            // InternalOCLinEcore.g:14046:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
            // InternalOCLinEcore.g:14047:1: ( rule__StructuredClassCS__Group_6__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_6());
            }
            // InternalOCLinEcore.g:14048:1: ( rule__StructuredClassCS__Group_6__0 )?
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( (LA168_0==100) ) {
                int LA168_1 = input.LA(2);

                if ( (LA168_1==32) ) {
                    alt168=1;
                }
                else if ( (LA168_1==101) ) {
                    int LA168_4 = input.LA(3);

                    if ( (LA168_4==52||LA168_4==100) ) {
                        alt168=1;
                    }
                }
            }
            switch (alt168) {
                case 1 :
                    // InternalOCLinEcore.g:14048: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:14058: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:14062:1: ( rule__StructuredClassCS__Group__7__Impl )
            // InternalOCLinEcore.g:14063: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:14069: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:14073:1: ( ( ( rule__StructuredClassCS__Alternatives_7 ) ) )
            // InternalOCLinEcore.g:14074:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
            {
            // InternalOCLinEcore.g:14074:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
            // InternalOCLinEcore.g:14075:1: ( rule__StructuredClassCS__Alternatives_7 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7());
            }
            // InternalOCLinEcore.g:14076:1: ( rule__StructuredClassCS__Alternatives_7 )
            // InternalOCLinEcore.g:14076: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:14102: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:14106:1: ( rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 )
            // InternalOCLinEcore.g:14107: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:14114: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:14118:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:14119:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:14119:1: ( 'extends' )
            // InternalOCLinEcore.g:14120: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:14133: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:14137:1: ( rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 )
            // InternalOCLinEcore.g:14138: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:14145: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:14149:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) )
            // InternalOCLinEcore.g:14150:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
            {
            // InternalOCLinEcore.g:14150:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
            // InternalOCLinEcore.g:14151:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_1());
            }
            // InternalOCLinEcore.g:14152:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
            // InternalOCLinEcore.g:14152: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:14162: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:14166:1: ( rule__StructuredClassCS__Group_4__2__Impl )
            // InternalOCLinEcore.g:14167: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:14173: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:14177:1: ( ( ( rule__StructuredClassCS__Group_4_2__0 )* ) )
            // InternalOCLinEcore.g:14178:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
            {
            // InternalOCLinEcore.g:14178:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
            // InternalOCLinEcore.g:14179:1: ( rule__StructuredClassCS__Group_4_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getGroup_4_2());
            }
            // InternalOCLinEcore.g:14180:1: ( rule__StructuredClassCS__Group_4_2__0 )*
            loop169:
            do {
                int alt169=2;
                int LA169_0 = input.LA(1);

                if ( (LA169_0==99) ) {
                    alt169=1;
                }


                switch (alt169) {
            	case 1 :
            	    // InternalOCLinEcore.g:14180: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 loop169;
                }
            } 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:14196: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:14200:1: ( rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 )
            // InternalOCLinEcore.g:14201: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:14208: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:14212:1: ( ( ',' ) )
            // InternalOCLinEcore.g:14213:1: ( ',' )
            {
            // InternalOCLinEcore.g:14213:1: ( ',' )
            // InternalOCLinEcore.g:14214:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());
            }
            match(input,99,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:14227: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:14231:1: ( rule__StructuredClassCS__Group_4_2__1__Impl )
            // InternalOCLinEcore.g:14232: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:14238: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:14242:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) )
            // InternalOCLinEcore.g:14243:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
            {
            // InternalOCLinEcore.g:14243:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
            // InternalOCLinEcore.g:14244:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_2_1());
            }
            // InternalOCLinEcore.g:14245:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
            // InternalOCLinEcore.g:14245: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:14259: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:14263:1: ( rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 )
            // InternalOCLinEcore.g:14264: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:14271:1: rule__StructuredClassCS__Group_5__0__Impl : ( ':' ) ;
    public final void rule__StructuredClassCS__Group_5__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14275:1: ( ( ':' ) )
            // InternalOCLinEcore.g:14276:1: ( ':' )
            {
            // InternalOCLinEcore.g:14276:1: ( ':' )
            // InternalOCLinEcore.g:14277:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());
            }
            match(input,98,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:14290: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:14294:1: ( rule__StructuredClassCS__Group_5__1__Impl )
            // InternalOCLinEcore.g:14295: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:14301: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:14305:1: ( ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) )
            // InternalOCLinEcore.g:14306:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
            {
            // InternalOCLinEcore.g:14306:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
            // InternalOCLinEcore.g:14307:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameAssignment_5_1());
            }
            // InternalOCLinEcore.g:14308:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
            // InternalOCLinEcore.g:14308: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:14322: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:14326:1: ( rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 )
            // InternalOCLinEcore.g:14327: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:14334:1: rule__StructuredClassCS__Group_6__0__Impl : ( '{' ) ;
    public final void rule__StructuredClassCS__Group_6__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14338:1: ( ( '{' ) )
            // InternalOCLinEcore.g:14339:1: ( '{' )
            {
            // InternalOCLinEcore.g:14339:1: ( '{' )
            // InternalOCLinEcore.g:14340:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());
            }
            match(input,100,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:14353: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:14357:1: ( rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 )
            // InternalOCLinEcore.g:14358: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:14365: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:14369:1: ( ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) )
            // InternalOCLinEcore.g:14370:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
            {
            // InternalOCLinEcore.g:14370:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
            // InternalOCLinEcore.g:14371:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceAssignment_6_1());
            }
            // InternalOCLinEcore.g:14372:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
            int alt170=2;
            int LA170_0 = input.LA(1);

            if ( (LA170_0==32) ) {
                alt170=1;
            }
            switch (alt170) {
                case 1 :
                    // InternalOCLinEcore.g:14372: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:14382: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:14386:1: ( rule__StructuredClassCS__Group_6__2__Impl )
            // InternalOCLinEcore.g:14387: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:14393:1: rule__StructuredClassCS__Group_6__2__Impl : ( '}' ) ;
    public final void rule__StructuredClassCS__Group_6__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14397:1: ( ( '}' ) )
            // InternalOCLinEcore.g:14398:1: ( '}' )
            {
            // InternalOCLinEcore.g:14398:1: ( '}' )
            // InternalOCLinEcore.g:14399:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());
            }
            match(input,101,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:14418: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:14422:1: ( rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 )
            // InternalOCLinEcore.g:14423: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:14430: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:14434:1: ( ( '{' ) )
            // InternalOCLinEcore.g:14435:1: ( '{' )
            {
            // InternalOCLinEcore.g:14435:1: ( '{' )
            // InternalOCLinEcore.g:14436:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());
            }
            match(input,100,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:14449: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:14453:1: ( rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 )
            // InternalOCLinEcore.g:14454: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:14461: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:14465:1: ( ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) )
            // InternalOCLinEcore.g:14466:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
            {
            // InternalOCLinEcore.g:14466:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
            // InternalOCLinEcore.g:14467:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7_0_1());
            }
            // InternalOCLinEcore.g:14468:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
            loop171:
            do {
                int alt171=2;
                int LA171_0 = input.LA(1);

                if ( (LA171_0==18||LA171_0==20||LA171_0==24||LA171_0==36||LA171_0==42||LA171_0==46||(LA171_0>=54 && LA171_0<=56)||LA171_0==59) ) {
                    alt171=1;
                }


                switch (alt171) {
            	case 1 :
            	    // InternalOCLinEcore.g:14468: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 loop171;
                }
            } 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:14478: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:14482:1: ( rule__StructuredClassCS__Group_7_0__2__Impl )
            // InternalOCLinEcore.g:14483: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:14489: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:14493:1: ( ( '}' ) )
            // InternalOCLinEcore.g:14494:1: ( '}' )
            {
            // InternalOCLinEcore.g:14494:1: ( '}' )
            // InternalOCLinEcore.g:14495:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());
            }
            match(input,101,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:14514: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:14518:1: ( rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 )
            // InternalOCLinEcore.g:14519: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:14526:1: rule__SysMLCS__Group__0__Impl : ( () ) ;
    public final void rule__SysMLCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14530:1: ( ( () ) )
            // InternalOCLinEcore.g:14531:1: ( () )
            {
            // InternalOCLinEcore.g:14531:1: ( () )
            // InternalOCLinEcore.g:14532:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSysMLCSAction_0());
            }
            // InternalOCLinEcore.g:14533:1: ()
            // InternalOCLinEcore.g:14535: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:14545: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:14549:1: ( rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 )
            // InternalOCLinEcore.g:14550: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:14557:1: rule__SysMLCS__Group__1__Impl : ( 'sysml' ) ;
    public final void rule__SysMLCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14561:1: ( ( 'sysml' ) )
            // InternalOCLinEcore.g:14562:1: ( 'sysml' )
            {
            // InternalOCLinEcore.g:14562:1: ( 'sysml' )
            // InternalOCLinEcore.g:14563:1: 'sysml'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getSysmlKeyword_1());
            }
            match(input,59,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:14576: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:14580:1: ( rule__SysMLCS__Group__2__Impl )
            // InternalOCLinEcore.g:14581: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:14587: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:14591:1: ( ( ( rule__SysMLCS__Alternatives_2 ) ) )
            // InternalOCLinEcore.g:14592:1: ( ( rule__SysMLCS__Alternatives_2 ) )
            {
            // InternalOCLinEcore.g:14592:1: ( ( rule__SysMLCS__Alternatives_2 ) )
            // InternalOCLinEcore.g:14593:1: ( rule__SysMLCS__Alternatives_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:14594:1: ( rule__SysMLCS__Alternatives_2 )
            // InternalOCLinEcore.g:14594: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:14610: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:14614:1: ( rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 )
            // InternalOCLinEcore.g:14615:2: rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_53);
            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:14622: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:14626:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) )
            // InternalOCLinEcore.g:14627:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
            {
            // InternalOCLinEcore.g:14627:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
            // InternalOCLinEcore.g:14628:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_0_0());
            }
            // InternalOCLinEcore.g:14629:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
            // InternalOCLinEcore.g:14629: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:14639: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:14643:1: ( rule__SysMLCS__Group_2_0__1__Impl )
            // InternalOCLinEcore.g:14644: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:14650: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:14654:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14655:1: ( ';' )
            {
            // InternalOCLinEcore.g:14655:1: ( ';' )
            // InternalOCLinEcore.g:14656: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:14673: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:14677:1: ( rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 )
            // InternalOCLinEcore.g:14678: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:14685: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:14689:1: ( ( '{' ) )
            // InternalOCLinEcore.g:14690:1: ( '{' )
            {
            // InternalOCLinEcore.g:14690:1: ( '{' )
            // InternalOCLinEcore.g:14691:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getLeftCurlyBracketKeyword_2_1_0());
            }
            match(input,100,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:14704: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:14708:1: ( rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 )
            // InternalOCLinEcore.g:14709: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:14716: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:14720:1: ( ( ( rule__SysMLCS__Group_2_1_1__0 )* ) )
            // InternalOCLinEcore.g:14721:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
            {
            // InternalOCLinEcore.g:14721:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
            // InternalOCLinEcore.g:14722:1: ( rule__SysMLCS__Group_2_1_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getGroup_2_1_1());
            }
            // InternalOCLinEcore.g:14723:1: ( rule__SysMLCS__Group_2_1_1__0 )*
            loop172:
            do {
                int alt172=2;
                int LA172_0 = input.LA(1);

                if ( (LA172_0==RULE_SINGLE_QUOTED_STRING||(LA172_0>=RULE_SIMPLE_ID && LA172_0<=RULE_ESCAPED_ID)||(LA172_0>=17 && LA172_0<=51)||(LA172_0>=54 && LA172_0<=59)) ) {
                    alt172=1;
                }


                switch (alt172) {
            	case 1 :
            	    // InternalOCLinEcore.g:14723: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 loop172;
                }
            } 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:14733: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:14737:1: ( rule__SysMLCS__Group_2_1__2__Impl )
            // InternalOCLinEcore.g:14738: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:14744: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:14748:1: ( ( '}' ) )
            // InternalOCLinEcore.g:14749:1: ( '}' )
            {
            // InternalOCLinEcore.g:14749:1: ( '}' )
            // InternalOCLinEcore.g:14750:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getRightCurlyBracketKeyword_2_1_2());
            }
            match(input,101,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:14769: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:14773:1: ( rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 )
            // InternalOCLinEcore.g:14774:2: rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_53);
            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:14781: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:14785:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) )
            // InternalOCLinEcore.g:14786:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
            {
            // InternalOCLinEcore.g:14786:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
            // InternalOCLinEcore.g:14787:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_1_1_0());
            }
            // InternalOCLinEcore.g:14788:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
            // InternalOCLinEcore.g:14788: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:14798: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:14802:1: ( rule__SysMLCS__Group_2_1_1__1__Impl )
            // InternalOCLinEcore.g:14803: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:14809: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:14813:1: ( ( ';' ) )
            // InternalOCLinEcore.g:14814:1: ( ';' )
            {
            // InternalOCLinEcore.g:14814:1: ( ';' )
            // InternalOCLinEcore.g:14815: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:14832: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:14836:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
            // InternalOCLinEcore.g:14837: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:14844:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ruleTypedRefCS ) ;
    public final void rule__TypedMultiplicityRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14848:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:14849:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:14849:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:14850: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:14861: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:14865:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
            // InternalOCLinEcore.g:14866: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:14872: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:14876:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:14877:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:14877:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:14878:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:14879:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
            int alt173=2;
            int LA173_0 = input.LA(1);

            if ( (LA173_0==111) ) {
                alt173=1;
            }
            switch (alt173) {
                case 1 :
                    // InternalOCLinEcore.g:14879: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:14893: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:14897:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
            // InternalOCLinEcore.g:14898: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:14905:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
    public final void rule__TemplateSignatureCS__Group_0__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.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
            }
            match(input,96,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:14924: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:14928:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
            // InternalOCLinEcore.g:14929: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:14936: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:14940:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:14941:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:14941:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
            // InternalOCLinEcore.g:14942:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_1());
            }
            // InternalOCLinEcore.g:14943:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
            // InternalOCLinEcore.g:14943: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:14953: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:14957:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
            // InternalOCLinEcore.g:14958: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:14965: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:14969:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
            // InternalOCLinEcore.g:14970:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
            {
            // InternalOCLinEcore.g:14970:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
            // InternalOCLinEcore.g:14971:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0_2());
            }
            // InternalOCLinEcore.g:14972:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
            loop174:
            do {
                int alt174=2;
                int LA174_0 = input.LA(1);

                if ( (LA174_0==99) ) {
                    alt174=1;
                }


                switch (alt174) {
            	case 1 :
            	    // InternalOCLinEcore.g:14972: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 loop174;
                }
            } 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:14982: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:14986:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
            // InternalOCLinEcore.g:14987: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:14993:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
    public final void rule__TemplateSignatureCS__Group_0__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:14997:1: ( ( ')' ) )
            // InternalOCLinEcore.g:14998:1: ( ')' )
            {
            // InternalOCLinEcore.g:14998:1: ( ')' )
            // InternalOCLinEcore.g:14999:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());
            }
            match(input,97,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:15020: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:15024:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
            // InternalOCLinEcore.g:15025: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:15032: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:15036:1: ( ( ',' ) )
            // InternalOCLinEcore.g:15037:1: ( ',' )
            {
            // InternalOCLinEcore.g:15037:1: ( ',' )
            // InternalOCLinEcore.g:15038:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
            }
            match(input,99,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:15051: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:15055:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
            // InternalOCLinEcore.g:15056: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:15062: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:15066:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
            // InternalOCLinEcore.g:15067:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
            {
            // InternalOCLinEcore.g:15067:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
            // InternalOCLinEcore.g:15068:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_2_1());
            }
            // InternalOCLinEcore.g:15069:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
            // InternalOCLinEcore.g:15069: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:15083: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:15087:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
            // InternalOCLinEcore.g:15088: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:15095:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
    public final void rule__TemplateSignatureCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15099:1: ( ( '<' ) )
            // InternalOCLinEcore.g:15100:1: ( '<' )
            {
            // InternalOCLinEcore.g:15100:1: ( '<' )
            // InternalOCLinEcore.g:15101:1: '<'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
            }
            match(input,66,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:15114: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:15118:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
            // InternalOCLinEcore.g:15119: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:15126: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:15130:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15131:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15131:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
            // InternalOCLinEcore.g:15132:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_1());
            }
            // InternalOCLinEcore.g:15133:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
            // InternalOCLinEcore.g:15133: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:15143: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:15147:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
            // InternalOCLinEcore.g:15148: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:15155: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:15159:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
            // InternalOCLinEcore.g:15160:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
            {
            // InternalOCLinEcore.g:15160:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
            // InternalOCLinEcore.g:15161:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1_2());
            }
            // InternalOCLinEcore.g:15162:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
            loop175:
            do {
                int alt175=2;
                int LA175_0 = input.LA(1);

                if ( (LA175_0==99) ) {
                    alt175=1;
                }


                switch (alt175) {
            	case 1 :
            	    // InternalOCLinEcore.g:15162: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 loop175;
                }
            } 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:15172: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:15176:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
            // InternalOCLinEcore.g:15177: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:15183:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
    public final void rule__TemplateSignatureCS__Group_1__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15187:1: ( ( '>' ) )
            // InternalOCLinEcore.g:15188:1: ( '>' )
            {
            // InternalOCLinEcore.g:15188:1: ( '>' )
            // InternalOCLinEcore.g:15189:1: '>'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());
            }
            match(input,65,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:15210: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:15214:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
            // InternalOCLinEcore.g:15215: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:15222: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:15226:1: ( ( ',' ) )
            // InternalOCLinEcore.g:15227:1: ( ',' )
            {
            // InternalOCLinEcore.g:15227:1: ( ',' )
            // InternalOCLinEcore.g:15228:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
            }
            match(input,99,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:15241: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:15245:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
            // InternalOCLinEcore.g:15246: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:15252: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:15256:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
            // InternalOCLinEcore.g:15257:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
            {
            // InternalOCLinEcore.g:15257:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
            // InternalOCLinEcore.g:15258:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_2_1());
            }
            // InternalOCLinEcore.g:15259:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
            // InternalOCLinEcore.g:15259: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:15273: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:15277:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
            // InternalOCLinEcore.g:15278: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:15285: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:15289:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:15290:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:15290:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:15291:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:15292:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:15292: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:15302: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:15306:1: ( rule__TypedTypeRefCS__Group__1__Impl )
            // InternalOCLinEcore.g:15307: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:15313: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:15317:1: ( ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) )
            // InternalOCLinEcore.g:15318:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
            {
            // InternalOCLinEcore.g:15318:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
            // InternalOCLinEcore.g:15319:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getAlternatives_1());
            }
            // InternalOCLinEcore.g:15320:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
            int alt176=2;
            int LA176_0 = input.LA(1);

            if ( (LA176_0==66||LA176_0==96) ) {
                alt176=1;
            }
            switch (alt176) {
                case 1 :
                    // InternalOCLinEcore.g:15320: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:15334: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:15338:1: ( rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 )
            // InternalOCLinEcore.g:15339: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:15346: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:15350:1: ( ( '(' ) )
            // InternalOCLinEcore.g:15351:1: ( '(' )
            {
            // InternalOCLinEcore.g:15351:1: ( '(' )
            // InternalOCLinEcore.g:15352:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0_0());
            }
            match(input,96,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:15365: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:15369:1: ( rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 )
            // InternalOCLinEcore.g:15370: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:15377: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:15381:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) )
            // InternalOCLinEcore.g:15382:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
            {
            // InternalOCLinEcore.g:15382:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
            // InternalOCLinEcore.g:15383:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_0_1());
            }
            // InternalOCLinEcore.g:15384:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
            // InternalOCLinEcore.g:15384: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:15394: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:15398:1: ( rule__TypedTypeRefCS__Group_1_0__2__Impl )
            // InternalOCLinEcore.g:15399: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:15405: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:15409:1: ( ( ')' ) )
            // InternalOCLinEcore.g:15410:1: ( ')' )
            {
            // InternalOCLinEcore.g:15410:1: ( ')' )
            // InternalOCLinEcore.g:15411:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_0_2());
            }
            match(input,97,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:15430: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:15434:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
            // InternalOCLinEcore.g:15435: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:15442: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:15446:1: ( ( '<' ) )
            // InternalOCLinEcore.g:15447:1: ( '<' )
            {
            // InternalOCLinEcore.g:15447:1: ( '<' )
            // InternalOCLinEcore.g:15448:1: '<'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getLessThanSignKeyword_1_1_0());
            }
            match(input,66,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:15461: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:15465:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
            // InternalOCLinEcore.g:15466: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:15473: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:15477:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:15478:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:15478:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:15479:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:15480:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
            // InternalOCLinEcore.g:15480: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:15490: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:15494:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:15495: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:15501: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:15505:1: ( ( '>' ) )
            // InternalOCLinEcore.g:15506:1: ( '>' )
            {
            // InternalOCLinEcore.g:15506:1: ( '>' )
            // InternalOCLinEcore.g:15507:1: '>'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypedTypeRefCSAccess().getGreaterThanSignKeyword_1_1_2());
            }
            match(input,65,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:15526: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:15530:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
            // InternalOCLinEcore.g:15531: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:15538: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:15542:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
            // InternalOCLinEcore.g:15543:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:15543:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
            // InternalOCLinEcore.g:15544:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }
            // InternalOCLinEcore.g:15545:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
            // InternalOCLinEcore.g:15545: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:15555: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:15559:1: ( rule__URIPathNameCS__Group__1__Impl )
            // InternalOCLinEcore.g:15560: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:15566: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:15570:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:15571:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:15571:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
            // InternalOCLinEcore.g:15572:1: ( rule__URIPathNameCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:15573:1: ( rule__URIPathNameCS__Group_1__0 )*
            loop177:
            do {
                int alt177=2;
                int LA177_0 = input.LA(1);

                if ( (LA177_0==103) ) {
                    alt177=1;
                }


                switch (alt177) {
            	case 1 :
            	    // InternalOCLinEcore.g:15573:2: rule__URIPathNameCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_87);
            	    rule__URIPathNameCS__Group_1__0();

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

            	    }
            	    break;

            	default :
            	    break loop177;
                }
            } 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:15587: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:15591:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
            // InternalOCLinEcore.g:15592: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:15599:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
    public final void rule__URIPathNameCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15603:1: ( ( '::' ) )
            // InternalOCLinEcore.g:15604:1: ( '::' )
            {
            // InternalOCLinEcore.g:15604:1: ( '::' )
            // InternalOCLinEcore.g:15605:1: '::'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
            }
            match(input,103,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:15618: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:15622:1: ( rule__URIPathNameCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:15623: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:15629: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:15633:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15634:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15634:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
            // InternalOCLinEcore.g:15635:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }
            // InternalOCLinEcore.g:15636:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
            // InternalOCLinEcore.g:15636: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:15650: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:15654:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
            // InternalOCLinEcore.g:15655: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:15662:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
    public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15666:1: ( ( () ) )
            // InternalOCLinEcore.g:15667:1: ( () )
            {
            // InternalOCLinEcore.g:15667:1: ( () )
            // InternalOCLinEcore.g:15668:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
            }
            // InternalOCLinEcore.g:15669:1: ()
            // InternalOCLinEcore.g:15671: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:15681: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:15685:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:15686: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:15692: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:15696:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15697:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15697:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
            // InternalOCLinEcore.g:15698:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
            }
            // InternalOCLinEcore.g:15699:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
            // InternalOCLinEcore.g:15699: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:15713: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:15717:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
            // InternalOCLinEcore.g:15718: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:15725: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:15729:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:15730:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:15730:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:15731:1: ( rule__CollectionTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:15732:1: ( rule__CollectionTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:15732: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:15742: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:15746:1: ( rule__CollectionTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:15747: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:15753: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:15757:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:15758:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:15758:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:15759:1: ( rule__CollectionTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:15760:1: ( rule__CollectionTypeCS__Group_1__0 )?
            int alt178=2;
            int LA178_0 = input.LA(1);

            if ( (LA178_0==96) ) {
                alt178=1;
            }
            switch (alt178) {
                case 1 :
                    // InternalOCLinEcore.g:15760: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:15774: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:15778:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:15779: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:15786:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15790:1: ( ( '(' ) )
            // InternalOCLinEcore.g:15791:1: ( '(' )
            {
            // InternalOCLinEcore.g:15791:1: ( '(' )
            // InternalOCLinEcore.g:15792:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,96,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:15805: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:15809:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:15810:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_13);
            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:15817: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:15821:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15822:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15822:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:15823:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:15824:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:15824: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:15834:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl ;
    public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15838:1: ( rule__CollectionTypeCS__Group_1__2__Impl )
            // InternalOCLinEcore.g:15839:2: rule__CollectionTypeCS__Group_1__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CollectionTypeCS__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__CollectionTypeCS__Group_1__2"


    // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
    // InternalOCLinEcore.g:15845:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ')' ) ;
    public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15849:1: ( ( ')' ) )
            // InternalOCLinEcore.g:15850:1: ( ')' )
            {
            // InternalOCLinEcore.g:15850:1: ( ')' )
            // InternalOCLinEcore.g:15851:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_2());
            }
            match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_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__MapTypeCS__Group__0"
    // InternalOCLinEcore.g:15870: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:15874:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
            // InternalOCLinEcore.g:15875: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:15882: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:15886:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:15887:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:15887:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:15888:1: ( rule__MapTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:15889:1: ( rule__MapTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:15889: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:15899: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:15903:1: ( rule__MapTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:15904: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:15910: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:15914:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:15915:1: ( ( rule__MapTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:15915:1: ( ( rule__MapTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:15916:1: ( rule__MapTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:15917:1: ( rule__MapTypeCS__Group_1__0 )?
            int alt179=2;
            int LA179_0 = input.LA(1);

            if ( (LA179_0==96) ) {
                alt179=1;
            }
            switch (alt179) {
                case 1 :
                    // InternalOCLinEcore.g:15917: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:15931: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:15935:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:15936: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:15943:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:15947:1: ( ( '(' ) )
            // InternalOCLinEcore.g:15948:1: ( '(' )
            {
            // InternalOCLinEcore.g:15948:1: ( '(' )
            // InternalOCLinEcore.g:15949:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,96,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:15962: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:15966:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:15967: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:15974: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:15978:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:15979:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:15979:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:15980:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:15981:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
            // InternalOCLinEcore.g:15981: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:15991: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:15995:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
            // InternalOCLinEcore.g:15996: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:16003:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
    public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16007:1: ( ( ',' ) )
            // InternalOCLinEcore.g:16008:1: ( ',' )
            {
            // InternalOCLinEcore.g:16008:1: ( ',' )
            // InternalOCLinEcore.g:16009:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
            }
            match(input,99,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:16022: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:16026:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
            // InternalOCLinEcore.g:16027: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:16034: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:16038:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
            // InternalOCLinEcore.g:16039:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
            {
            // InternalOCLinEcore.g:16039:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
            // InternalOCLinEcore.g:16040:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
            }
            // InternalOCLinEcore.g:16041:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
            // InternalOCLinEcore.g:16041: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:16051: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:16055:1: ( rule__MapTypeCS__Group_1__4__Impl )
            // InternalOCLinEcore.g:16056: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:16062:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
    public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16066:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16067:1: ( ')' )
            {
            // InternalOCLinEcore.g:16067:1: ( ')' )
            // InternalOCLinEcore.g:16068:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
            }
            match(input,97,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:16091: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:16095:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
            // InternalOCLinEcore.g:16096: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:16103: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:16107:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:16108:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16108:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:16109:1: ( rule__TupleTypeCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:16110:1: ( rule__TupleTypeCS__NameAssignment_0 )
            // InternalOCLinEcore.g:16110: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:16120: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:16124:1: ( rule__TupleTypeCS__Group__1__Impl )
            // InternalOCLinEcore.g:16125: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:16131: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:16135:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:16136:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:16136:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
            // InternalOCLinEcore.g:16137:1: ( rule__TupleTypeCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:16138:1: ( rule__TupleTypeCS__Group_1__0 )?
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( (LA180_0==96) ) {
                alt180=1;
            }
            switch (alt180) {
                case 1 :
                    // InternalOCLinEcore.g:16138: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:16152: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:16156:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
            // InternalOCLinEcore.g:16157:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_56);
            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:16164:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
    public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16168:1: ( ( '(' ) )
            // InternalOCLinEcore.g:16169:1: ( '(' )
            {
            // InternalOCLinEcore.g:16169:1: ( '(' )
            // InternalOCLinEcore.g:16170:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
            }
            match(input,96,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:16183: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:16187:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
            // InternalOCLinEcore.g:16188:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_56);
            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:16195: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:16199:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:16200:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:16200:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:16201:1: ( rule__TupleTypeCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:16202:1: ( rule__TupleTypeCS__Group_1_1__0 )?
            int alt181=2;
            int LA181_0 = input.LA(1);

            if ( ((LA181_0>=RULE_SIMPLE_ID && LA181_0<=RULE_ESCAPED_ID)||(LA181_0>=17 && LA181_0<=51)||(LA181_0>=54 && LA181_0<=59)) ) {
                alt181=1;
            }
            switch (alt181) {
                case 1 :
                    // InternalOCLinEcore.g:16202: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:16212: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:16216:1: ( rule__TupleTypeCS__Group_1__2__Impl )
            // InternalOCLinEcore.g:16217: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:16223:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
    public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16227:1: ( ( ')' ) )
            // InternalOCLinEcore.g:16228:1: ( ')' )
            {
            // InternalOCLinEcore.g:16228:1: ( ')' )
            // InternalOCLinEcore.g:16229:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
            }
            match(input,97,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:16248: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:16252:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
            // InternalOCLinEcore.g:16253: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:16260: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:16264:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
            // InternalOCLinEcore.g:16265:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
            {
            // InternalOCLinEcore.g:16265:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
            // InternalOCLinEcore.g:16266:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
            }
            // InternalOCLinEcore.g:16267:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
            // InternalOCLinEcore.g:16267: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:16277: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:16281:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
            // InternalOCLinEcore.g:16282: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:16288: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:16292:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
            // InternalOCLinEcore.g:16293:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
            {
            // InternalOCLinEcore.g:16293:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
            // InternalOCLinEcore.g:16294:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
            }
            // InternalOCLinEcore.g:16295:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
            loop182:
            do {
                int alt182=2;
                int LA182_0 = input.LA(1);

                if ( (LA182_0==99) ) {
                    alt182=1;
                }


                switch (alt182) {
            	case 1 :
            	    // InternalOCLinEcore.g:16295: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 loop182;
                }
            } 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:16309: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:16313:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
            // InternalOCLinEcore.g:16314: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:16321: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:16325:1: ( ( ',' ) )
            // InternalOCLinEcore.g:16326:1: ( ',' )
            {
            // InternalOCLinEcore.g:16326:1: ( ',' )
            // InternalOCLinEcore.g:16327:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
            }
            match(input,99,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:16340: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:16344:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
            // InternalOCLinEcore.g:16345: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:16351: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:16355:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
            // InternalOCLinEcore.g:16356:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
            {
            // InternalOCLinEcore.g:16356:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
            // InternalOCLinEcore.g:16357:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
            }
            // InternalOCLinEcore.g:16358:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
            // InternalOCLinEcore.g:16358: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:16372: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:16376:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
            // InternalOCLinEcore.g:16377:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_52);
            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:16384: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:16388:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:16389:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16389:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:16390:1: ( rule__TuplePartCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:16391:1: ( rule__TuplePartCS__NameAssignment_0 )
            // InternalOCLinEcore.g:16391: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:16401: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:16405:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
            // InternalOCLinEcore.g:16406: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:16413:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
    public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16417:1: ( ( ':' ) )
            // InternalOCLinEcore.g:16418:1: ( ':' )
            {
            // InternalOCLinEcore.g:16418:1: ( ':' )
            // InternalOCLinEcore.g:16419:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
            }
            match(input,98,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:16432: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:16436:1: ( rule__TuplePartCS__Group__2__Impl )
            // InternalOCLinEcore.g:16437: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:16443: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:16447:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
            // InternalOCLinEcore.g:16448:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
            {
            // InternalOCLinEcore.g:16448:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
            // InternalOCLinEcore.g:16449:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
            }
            // InternalOCLinEcore.g:16450:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
            // InternalOCLinEcore.g:16450: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:16466: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:16470:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:16471:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:16478: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:16482:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:16483:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16483:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:16484:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:16485:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:16485: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:16495: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:16499:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:16500: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:16507:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16511:1: ( ( '{' ) )
            // InternalOCLinEcore.g:16512:1: ( '{' )
            {
            // InternalOCLinEcore.g:16512:1: ( '{' )
            // InternalOCLinEcore.g:16513:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:16526: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:16530:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:16531: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:16538: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:16542:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:16543:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:16543:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
            // InternalOCLinEcore.g:16544:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:16545:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( ((LA183_0>=RULE_INT && LA183_0<=RULE_SINGLE_QUOTED_STRING)||(LA183_0>=RULE_SIMPLE_ID && LA183_0<=RULE_ESCAPED_ID)||(LA183_0>=17 && LA183_0<=51)||(LA183_0>=54 && LA183_0<=62)||(LA183_0>=79 && LA183_0<=93)||LA183_0==96||LA183_0==98||LA183_0==106||(LA183_0>=108 && LA183_0<=109)||LA183_0==114||(LA183_0>=119 && LA183_0<=120)||(LA183_0>=133 && LA183_0<=134)) ) {
                alt183=1;
            }
            switch (alt183) {
                case 1 :
                    // InternalOCLinEcore.g:16545: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:16555: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:16559:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:16560: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:16566:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16570:1: ( ( '}' ) )
            // InternalOCLinEcore.g:16571:1: ( '}' )
            {
            // InternalOCLinEcore.g:16571:1: ( '}' )
            // InternalOCLinEcore.g:16572:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,101,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:16593: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:16597:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
            // InternalOCLinEcore.g:16598: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:16605: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:16609:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:16610:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:16610:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:16611:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:16612:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:16612: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:16622: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:16626:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:16627: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:16633: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:16637:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:16638:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:16638:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:16639:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:16640:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
            loop184:
            do {
                int alt184=2;
                int LA184_0 = input.LA(1);

                if ( (LA184_0==99) ) {
                    alt184=1;
                }


                switch (alt184) {
            	case 1 :
            	    // InternalOCLinEcore.g:16640: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 loop184;
                }
            } 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:16654: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:16658:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
            // InternalOCLinEcore.g:16659: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:16666: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:16670:1: ( ( ',' ) )
            // InternalOCLinEcore.g:16671:1: ( ',' )
            {
            // InternalOCLinEcore.g:16671:1: ( ',' )
            // InternalOCLinEcore.g:16672:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,99,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:16685: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:16689:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:16690: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:16696: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:16700:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:16701:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:16701:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:16702:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:16703:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:16703: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:16717: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:16721:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
            // InternalOCLinEcore.g:16722: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:16729: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:16733:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
            // InternalOCLinEcore.g:16734:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
            {
            // InternalOCLinEcore.g:16734:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
            // InternalOCLinEcore.g:16735:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
            }
            // InternalOCLinEcore.g:16736:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
            // InternalOCLinEcore.g:16736: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:16746: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:16750:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:16751: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:16757: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:16761:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
            // InternalOCLinEcore.g:16762:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
            {
            // InternalOCLinEcore.g:16762:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
            // InternalOCLinEcore.g:16763:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
            }
            // InternalOCLinEcore.g:16764:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
            int alt185=2;
            int LA185_0 = input.LA(1);

            if ( (LA185_0==104) ) {
                alt185=1;
            }
            switch (alt185) {
                case 1 :
                    // InternalOCLinEcore.g:16764: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:16778: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:16782:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
            // InternalOCLinEcore.g:16783: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:16790: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:16794:1: ( ( '..' ) )
            // InternalOCLinEcore.g:16795:1: ( '..' )
            {
            // InternalOCLinEcore.g:16795:1: ( '..' )
            // InternalOCLinEcore.g:16796:1: '..'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
            }
            match(input,104,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:16809: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:16813:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
            // InternalOCLinEcore.g:16814: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:16820: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:16824:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
            // InternalOCLinEcore.g:16825:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
            {
            // InternalOCLinEcore.g:16825:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
            // InternalOCLinEcore.g:16826:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:16827:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
            // InternalOCLinEcore.g:16827: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:16841: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:16845:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
            // InternalOCLinEcore.g:16846:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:16853: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:16857:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:16858:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:16858:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:16859:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:16860:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:16860: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:16870: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:16874:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
            // InternalOCLinEcore.g:16875: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:16882:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16886:1: ( ( '{' ) )
            // InternalOCLinEcore.g:16887:1: ( '{' )
            {
            // InternalOCLinEcore.g:16887:1: ( '{' )
            // InternalOCLinEcore.g:16888:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:16901: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:16905:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
            // InternalOCLinEcore.g:16906: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:16913: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:16917:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:16918:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:16918:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
            // InternalOCLinEcore.g:16919:1: ( rule__CollectionPatternCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:16920:1: ( rule__CollectionPatternCS__Group_2__0 )?
            int alt186=2;
            int LA186_0 = input.LA(1);

            if ( ((LA186_0>=RULE_SIMPLE_ID && LA186_0<=RULE_ESCAPED_ID)||(LA186_0>=17 && LA186_0<=51)||(LA186_0>=54 && LA186_0<=59)||LA186_0==98) ) {
                alt186=1;
            }
            switch (alt186) {
                case 1 :
                    // InternalOCLinEcore.g:16920: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:16930: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:16934:1: ( rule__CollectionPatternCS__Group__3__Impl )
            // InternalOCLinEcore.g:16935: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:16941:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:16945:1: ( ( '}' ) )
            // InternalOCLinEcore.g:16946:1: ( '}' )
            {
            // InternalOCLinEcore.g:16946:1: ( '}' )
            // InternalOCLinEcore.g:16947:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,101,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:16968: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:16972:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
            // InternalOCLinEcore.g:16973: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:16980: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:16984:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:16985:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:16985:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:16986:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:16987:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:16987: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:16997: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:17001:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
            // InternalOCLinEcore.g:17002: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:17009: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:17013:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:17014:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:17014:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:17015:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:17016:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
            loop187:
            do {
                int alt187=2;
                int LA187_0 = input.LA(1);

                if ( (LA187_0==99) ) {
                    alt187=1;
                }


                switch (alt187) {
            	case 1 :
            	    // InternalOCLinEcore.g:17016: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 loop187;
                }
            } 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:17026: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:17030:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:17031: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:17037: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:17041:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
            // InternalOCLinEcore.g:17042:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
            {
            // InternalOCLinEcore.g:17042:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
            // InternalOCLinEcore.g:17043:1: ( rule__CollectionPatternCS__Group_2_2__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:17044:1: ( rule__CollectionPatternCS__Group_2_2__0 )
            // InternalOCLinEcore.g:17044: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:17060: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:17064:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
            // InternalOCLinEcore.g:17065: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:17072: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:17076:1: ( ( ',' ) )
            // InternalOCLinEcore.g:17077:1: ( ',' )
            {
            // InternalOCLinEcore.g:17077:1: ( ',' )
            // InternalOCLinEcore.g:17078:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,99,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:17091: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:17095:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:17096: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:17102: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:17106:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:17107:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:17107:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:17108:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:17109:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:17109: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:17123: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:17127:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
            // InternalOCLinEcore.g:17128: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:17135: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:17139:1: ( ( '++' ) )
            // InternalOCLinEcore.g:17140:1: ( '++' )
            {
            // InternalOCLinEcore.g:17140:1: ( '++' )
            // InternalOCLinEcore.g:17141:1: '++'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
            }
            match(input,105,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:17154: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:17158:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:17159: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:17165: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:17169:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:17170:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:17170:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:17171:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:17172:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
            // InternalOCLinEcore.g:17172: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"
    // InternalOCLinEcore.g:17186:1: rule__ShadowPartCS__Group__0 : rule__ShadowPartCS__Group__0__Impl rule__ShadowPartCS__Group__1 ;
    public final void rule__ShadowPartCS__Group__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17190:1: ( rule__ShadowPartCS__Group__0__Impl rule__ShadowPartCS__Group__1 )
            // InternalOCLinEcore.g:17191:2: rule__ShadowPartCS__Group__0__Impl rule__ShadowPartCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_40);
            rule__ShadowPartCS__Group__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group__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"


    // $ANTLR start "rule__ShadowPartCS__Group__0__Impl"
    // InternalOCLinEcore.g:17198:1: rule__ShadowPartCS__Group__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0 ) ) ;
    public final void rule__ShadowPartCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17202:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0 ) ) )
            // InternalOCLinEcore.g:17203:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17203:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0 ) )
            // InternalOCLinEcore.g:17204:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0());
            }
            // InternalOCLinEcore.g:17205:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0 )
            // InternalOCLinEcore.g:17205:2: rule__ShadowPartCS__ReferredPropertyAssignment_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__ReferredPropertyAssignment_0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ShadowPartCS__Group__1"
    // InternalOCLinEcore.g:17215:1: rule__ShadowPartCS__Group__1 : rule__ShadowPartCS__Group__1__Impl rule__ShadowPartCS__Group__2 ;
    public final void rule__ShadowPartCS__Group__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17219:1: ( rule__ShadowPartCS__Group__1__Impl rule__ShadowPartCS__Group__2 )
            // InternalOCLinEcore.g:17220:2: rule__ShadowPartCS__Group__1__Impl rule__ShadowPartCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_91);
            rule__ShadowPartCS__Group__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group__2();

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

            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ShadowPartCS__Group__1__Impl"
    // InternalOCLinEcore.g:17227:1: rule__ShadowPartCS__Group__1__Impl : ( '=' ) ;
    public final void rule__ShadowPartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17231:1: ( ( '=' ) )
            // InternalOCLinEcore.g:17232:1: ( '=' )
            {
            // InternalOCLinEcore.g:17232:1: ( '=' )
            // InternalOCLinEcore.g:17233:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_1());
            }
            match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_1());
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ShadowPartCS__Group__2"
    // InternalOCLinEcore.g:17246:1: rule__ShadowPartCS__Group__2 : rule__ShadowPartCS__Group__2__Impl ;
    public final void rule__ShadowPartCS__Group__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17250:1: ( rule__ShadowPartCS__Group__2__Impl )
            // InternalOCLinEcore.g:17251:2: rule__ShadowPartCS__Group__2__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__Group__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__2"


    // $ANTLR start "rule__ShadowPartCS__Group__2__Impl"
    // InternalOCLinEcore.g:17257:1: rule__ShadowPartCS__Group__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 ) ) ;
    public final void rule__ShadowPartCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17261:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 ) ) )
            // InternalOCLinEcore.g:17262:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17262:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 ) )
            // InternalOCLinEcore.g:17263:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_2());
            }
            // InternalOCLinEcore.g:17264:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_2 )
            // InternalOCLinEcore.g:17264:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__OwnedInitExpressionAssignment_2();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__PatternExpCS__Group__0"
    // InternalOCLinEcore.g:17280: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:17284:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
            // InternalOCLinEcore.g:17285: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:17292: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:17296:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
            // InternalOCLinEcore.g:17297:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
            {
            // InternalOCLinEcore.g:17297:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
            // InternalOCLinEcore.g:17298:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
            }
            // InternalOCLinEcore.g:17299:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
            int alt188=2;
            int LA188_0 = input.LA(1);

            if ( ((LA188_0>=RULE_SIMPLE_ID && LA188_0<=RULE_ESCAPED_ID)||(LA188_0>=17 && LA188_0<=51)||(LA188_0>=54 && LA188_0<=59)) ) {
                alt188=1;
            }
            switch (alt188) {
                case 1 :
                    // InternalOCLinEcore.g:17299: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:17309: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:17313:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
            // InternalOCLinEcore.g:17314: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:17321:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
    public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17325:1: ( ( ':' ) )
            // InternalOCLinEcore.g:17326:1: ( ':' )
            {
            // InternalOCLinEcore.g:17326:1: ( ':' )
            // InternalOCLinEcore.g:17327:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
            }
            match(input,98,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:17340: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:17344:1: ( rule__PatternExpCS__Group__2__Impl )
            // InternalOCLinEcore.g:17345: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:17351: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:17355:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
            // InternalOCLinEcore.g:17356:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17356:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
            // InternalOCLinEcore.g:17357:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
            }
            // InternalOCLinEcore.g:17358:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
            // InternalOCLinEcore.g:17358: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:17374: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:17378:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:17379:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:17386:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
    public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17390:1: ( ( 'Lambda' ) )
            // InternalOCLinEcore.g:17391:1: ( 'Lambda' )
            {
            // InternalOCLinEcore.g:17391:1: ( 'Lambda' )
            // InternalOCLinEcore.g:17392:1: 'Lambda'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
            }
            match(input,106,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:17405: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:17409:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:17410: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:17417:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17421:1: ( ( '{' ) )
            // InternalOCLinEcore.g:17422:1: ( '{' )
            {
            // InternalOCLinEcore.g:17422:1: ( '{' )
            // InternalOCLinEcore.g:17423:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:17436: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:17440:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:17441: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:17448: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:17452:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
            // InternalOCLinEcore.g:17453:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17453:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
            // InternalOCLinEcore.g:17454:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
            }
            // InternalOCLinEcore.g:17455:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
            // InternalOCLinEcore.g:17455: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:17465: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:17469:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:17470: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:17476:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17480:1: ( ( '}' ) )
            // InternalOCLinEcore.g:17481:1: ( '}' )
            {
            // InternalOCLinEcore.g:17481:1: ( '}' )
            // InternalOCLinEcore.g:17482:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,101,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:17503: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:17507:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:17508:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:17515: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:17519:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
            // InternalOCLinEcore.g:17520:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17520:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
            // InternalOCLinEcore.g:17521:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
            }
            // InternalOCLinEcore.g:17522:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
            // InternalOCLinEcore.g:17522: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:17532: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:17536:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:17537: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:17544:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17548:1: ( ( '{' ) )
            // InternalOCLinEcore.g:17549:1: ( '{' )
            {
            // InternalOCLinEcore.g:17549:1: ( '{' )
            // InternalOCLinEcore.g:17550:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:17563: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:17567:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:17568: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:17575: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:17579:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:17580:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:17580:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
            // InternalOCLinEcore.g:17581:1: ( rule__MapLiteralExpCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:17582:1: ( rule__MapLiteralExpCS__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<=62)||(LA189_0>=79 && LA189_0<=93)||LA189_0==96||LA189_0==106||(LA189_0>=108 && LA189_0<=109)||LA189_0==114||(LA189_0>=119 && LA189_0<=120)||(LA189_0>=133 && LA189_0<=134)) ) {
                alt189=1;
            }
            switch (alt189) {
                case 1 :
                    // InternalOCLinEcore.g:17582: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:17592: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:17596:1: ( rule__MapLiteralExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:17597: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:17603:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
    public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17607:1: ( ( '}' ) )
            // InternalOCLinEcore.g:17608:1: ( '}' )
            {
            // InternalOCLinEcore.g:17608:1: ( '}' )
            // InternalOCLinEcore.g:17609:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,101,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:17630: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:17634:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
            // InternalOCLinEcore.g:17635: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:17642: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:17646:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:17647:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:17647:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
            // InternalOCLinEcore.g:17648:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
            }
            // InternalOCLinEcore.g:17649:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
            // InternalOCLinEcore.g:17649: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:17659: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:17663:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:17664: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:17670: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:17674:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
            // InternalOCLinEcore.g:17675:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
            {
            // InternalOCLinEcore.g:17675:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
            // InternalOCLinEcore.g:17676:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
            }
            // InternalOCLinEcore.g:17677:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
            loop190:
            do {
                int alt190=2;
                int LA190_0 = input.LA(1);

                if ( (LA190_0==99) ) {
                    alt190=1;
                }


                switch (alt190) {
            	case 1 :
            	    // InternalOCLinEcore.g:17677: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 loop190;
                }
            } 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:17691: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:17695:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
            // InternalOCLinEcore.g:17696: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:17703: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:17707:1: ( ( ',' ) )
            // InternalOCLinEcore.g:17708:1: ( ',' )
            {
            // InternalOCLinEcore.g:17708:1: ( ',' )
            // InternalOCLinEcore.g:17709:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
            }
            match(input,99,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:17722: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:17726:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:17727: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:17733: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:17737:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:17738:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:17738:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:17739:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:17740:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
            // InternalOCLinEcore.g:17740: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:17754: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:17758:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
            // InternalOCLinEcore.g:17759: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:17766: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:17770:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
            // InternalOCLinEcore.g:17771:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
            {
            // InternalOCLinEcore.g:17771:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
            // InternalOCLinEcore.g:17772:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
            }
            // InternalOCLinEcore.g:17773:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
            // InternalOCLinEcore.g:17773: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:17783: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:17787:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
            // InternalOCLinEcore.g:17788: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:17795:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
    public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17799:1: ( ( '<-' ) )
            // InternalOCLinEcore.g:17800:1: ( '<-' )
            {
            // InternalOCLinEcore.g:17800:1: ( '<-' )
            // InternalOCLinEcore.g:17801:1: '<-'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
            }
            match(input,107,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:17814: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:17818:1: ( rule__MapLiteralPartCS__Group__2__Impl )
            // InternalOCLinEcore.g:17819: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:17825: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:17829:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
            // InternalOCLinEcore.g:17830:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17830:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
            // InternalOCLinEcore.g:17831:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
            }
            // InternalOCLinEcore.g:17832:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
            // InternalOCLinEcore.g:17832: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:17848: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:17852:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:17853:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:17860:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
    public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17864:1: ( ( 'Tuple' ) )
            // InternalOCLinEcore.g:17865:1: ( 'Tuple' )
            {
            // InternalOCLinEcore.g:17865:1: ( 'Tuple' )
            // InternalOCLinEcore.g:17866:1: 'Tuple'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
            }
            match(input,80,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:17879: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:17883:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
            // InternalOCLinEcore.g:17884: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:17891:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
    public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17895:1: ( ( '{' ) )
            // InternalOCLinEcore.g:17896:1: ( '{' )
            {
            // InternalOCLinEcore.g:17896:1: ( '{' )
            // InternalOCLinEcore.g:17897:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:17910: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:17914:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
            // InternalOCLinEcore.g:17915: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:17922: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:17926:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
            // InternalOCLinEcore.g:17927:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
            {
            // InternalOCLinEcore.g:17927:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
            // InternalOCLinEcore.g:17928:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
            }
            // InternalOCLinEcore.g:17929:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
            // InternalOCLinEcore.g:17929: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:17939: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:17943:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
            // InternalOCLinEcore.g:17944: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:17951: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:17955:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
            // InternalOCLinEcore.g:17956:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
            {
            // InternalOCLinEcore.g:17956:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
            // InternalOCLinEcore.g:17957:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
            }
            // InternalOCLinEcore.g:17958:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
            loop191:
            do {
                int alt191=2;
                int LA191_0 = input.LA(1);

                if ( (LA191_0==99) ) {
                    alt191=1;
                }


                switch (alt191) {
            	case 1 :
            	    // InternalOCLinEcore.g:17958:2: rule__TupleLiteralExpCS__Group_3__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TupleLiteralExpCS__Group_3__0();

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

            	    }
            	    break;

            	default :
            	    break loop191;
                }
            } 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:17968: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:17972:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:17973: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:17979:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
    public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:17983:1: ( ( '}' ) )
            // InternalOCLinEcore.g:17984:1: ( '}' )
            {
            // InternalOCLinEcore.g:17984:1: ( '}' )
            // InternalOCLinEcore.g:17985:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
            }
            match(input,101,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:18008: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:18012:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
            // InternalOCLinEcore.g:18013: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:18020:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
    public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18024:1: ( ( ',' ) )
            // InternalOCLinEcore.g:18025:1: ( ',' )
            {
            // InternalOCLinEcore.g:18025:1: ( ',' )
            // InternalOCLinEcore.g:18026:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
            }
            match(input,99,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:18039: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:18043:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
            // InternalOCLinEcore.g:18044: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:18050: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:18054:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
            // InternalOCLinEcore.g:18055:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
            {
            // InternalOCLinEcore.g:18055:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
            // InternalOCLinEcore.g:18056:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
            }
            // InternalOCLinEcore.g:18057:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
            // InternalOCLinEcore.g:18057: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:18071: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:18075:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
            // InternalOCLinEcore.g:18076: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:18083: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:18087:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:18088:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:18088:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:18089:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:18090:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
            // InternalOCLinEcore.g:18090: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:18100: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:18104:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
            // InternalOCLinEcore.g:18105: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:18112: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:18116:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:18117:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:18117:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
            // InternalOCLinEcore.g:18118:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:18119:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
            int alt192=2;
            int LA192_0 = input.LA(1);

            if ( (LA192_0==98) ) {
                alt192=1;
            }
            switch (alt192) {
                case 1 :
                    // InternalOCLinEcore.g:18119: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:18129: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:18133:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
            // InternalOCLinEcore.g:18134: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:18141:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
    public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18145:1: ( ( '=' ) )
            // InternalOCLinEcore.g:18146:1: ( '=' )
            {
            // InternalOCLinEcore.g:18146:1: ( '=' )
            // InternalOCLinEcore.g:18147:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
            }
            match(input,69,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:18160: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:18164:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
            // InternalOCLinEcore.g:18165: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:18171: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:18175:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:18176:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:18176:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:18177:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:18178:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
            // InternalOCLinEcore.g:18178: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:18196: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:18200:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
            // InternalOCLinEcore.g:18201: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:18208:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18212:1: ( ( ':' ) )
            // InternalOCLinEcore.g:18213:1: ( ':' )
            {
            // InternalOCLinEcore.g:18213:1: ( ':' )
            // InternalOCLinEcore.g:18214:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
            }
            match(input,98,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:18227: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:18231:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:18232: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:18238: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:18242:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:18243:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:18243:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:18244:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:18245:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:18245: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:18259: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:18263:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18264: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:18271:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18275:1: ( ( () ) )
            // InternalOCLinEcore.g:18276:1: ( () )
            {
            // InternalOCLinEcore.g:18276:1: ( () )
            // InternalOCLinEcore.g:18277:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:18278:1: ()
            // InternalOCLinEcore.g:18280: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:18290: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:18294:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:18295: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:18301:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
    public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18305:1: ( ( '*' ) )
            // InternalOCLinEcore.g:18306:1: ( '*' )
            {
            // InternalOCLinEcore.g:18306:1: ( '*' )
            // InternalOCLinEcore.g:18307:1: '*'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
            }
            match(input,62,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:18324: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:18328:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18329: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:18336:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18340:1: ( ( () ) )
            // InternalOCLinEcore.g:18341:1: ( () )
            {
            // InternalOCLinEcore.g:18341:1: ( () )
            // InternalOCLinEcore.g:18342:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:18343:1: ()
            // InternalOCLinEcore.g:18345: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:18355: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:18359:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:18360: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:18366:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
    public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18370:1: ( ( 'invalid' ) )
            // InternalOCLinEcore.g:18371:1: ( 'invalid' )
            {
            // InternalOCLinEcore.g:18371:1: ( 'invalid' )
            // InternalOCLinEcore.g:18372:1: 'invalid'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
            }
            match(input,108,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:18389: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:18393:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
            // InternalOCLinEcore.g:18394: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:18401:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
    public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18405:1: ( ( () ) )
            // InternalOCLinEcore.g:18406:1: ( () )
            {
            // InternalOCLinEcore.g:18406:1: ( () )
            // InternalOCLinEcore.g:18407:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
            }
            // InternalOCLinEcore.g:18408:1: ()
            // InternalOCLinEcore.g:18410: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:18420: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:18424:1: ( rule__NullLiteralExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:18425: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:18431:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
    public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18435:1: ( ( 'null' ) )
            // InternalOCLinEcore.g:18436:1: ( 'null' )
            {
            // InternalOCLinEcore.g:18436:1: ( 'null' )
            // InternalOCLinEcore.g:18437:1: 'null'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
            }
            match(input,109,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:18454: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:18458:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
            // InternalOCLinEcore.g:18459: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:18466:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
    public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18470:1: ( ( ruleTypeLiteralCS ) )
            // InternalOCLinEcore.g:18471:1: ( ruleTypeLiteralCS )
            {
            // InternalOCLinEcore.g:18471:1: ( ruleTypeLiteralCS )
            // InternalOCLinEcore.g:18472: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:18483: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:18487:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
            // InternalOCLinEcore.g:18488: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:18494: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:18498:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:18499:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:18499:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:18500:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:18501:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
            int alt193=2;
            int LA193_0 = input.LA(1);

            if ( (LA193_0==111) ) {
                alt193=1;
            }
            switch (alt193) {
                case 1 :
                    // InternalOCLinEcore.g:18501: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:18515: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:18519:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
            // InternalOCLinEcore.g:18520:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:18527: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:18531:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:18532:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:18532:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:18533:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:18534:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:18534: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:18544: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:18548:1: ( rule__TypeNameExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:18549: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:18555: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:18559:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:18560:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:18560:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
            // InternalOCLinEcore.g:18561:1: ( rule__TypeNameExpCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:18562:1: ( rule__TypeNameExpCS__Group_1__0 )?
            int alt194=2;
            int LA194_0 = input.LA(1);

            if ( (LA194_0==100) ) {
                alt194=1;
            }
            switch (alt194) {
                case 1 :
                    // InternalOCLinEcore.g:18562: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:18576: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:18580:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
            // InternalOCLinEcore.g:18581:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:18588: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:18592:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
            // InternalOCLinEcore.g:18593:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
            {
            // InternalOCLinEcore.g:18593:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
            // InternalOCLinEcore.g:18594:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
            }
            // InternalOCLinEcore.g:18595:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
            // InternalOCLinEcore.g:18595: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:18605: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:18609:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:18610: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:18616: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:18620:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
            // InternalOCLinEcore.g:18621:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
            {
            // InternalOCLinEcore.g:18621:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
            // InternalOCLinEcore.g:18622:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
            }
            // InternalOCLinEcore.g:18623:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==100) ) {
                alt195=1;
            }
            switch (alt195) {
                case 1 :
                    // InternalOCLinEcore.g:18623: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:18637: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:18641:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
            // InternalOCLinEcore.g:18642: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:18649: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:18653:1: ( ( '{' ) )
            // InternalOCLinEcore.g:18654:1: ( '{' )
            {
            // InternalOCLinEcore.g:18654:1: ( '{' )
            // InternalOCLinEcore.g:18655:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
            }
            match(input,100,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:18668: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:18672:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
            // InternalOCLinEcore.g:18673: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:18680: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:18684:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
            // InternalOCLinEcore.g:18685:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
            {
            // InternalOCLinEcore.g:18685:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
            // InternalOCLinEcore.g:18686:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
            }
            // InternalOCLinEcore.g:18687:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
            // InternalOCLinEcore.g:18687: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:18697: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:18701:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
            // InternalOCLinEcore.g:18702: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:18708: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:18712:1: ( ( '}' ) )
            // InternalOCLinEcore.g:18713:1: ( '}' )
            {
            // InternalOCLinEcore.g:18713:1: ( '}' )
            // InternalOCLinEcore.g:18714:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
            }
            match(input,101,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:18733: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:18737:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
            // InternalOCLinEcore.g:18738: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:18745:1: rule__TypeExpCS__Group__0__Impl : ( ( rule__TypeExpCS__Alternatives_0 ) ) ;
    public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18749:1: ( ( ( rule__TypeExpCS__Alternatives_0 ) ) )
            // InternalOCLinEcore.g:18750:1: ( ( rule__TypeExpCS__Alternatives_0 ) )
            {
            // InternalOCLinEcore.g:18750:1: ( ( rule__TypeExpCS__Alternatives_0 ) )
            // InternalOCLinEcore.g:18751:1: ( rule__TypeExpCS__Alternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getAlternatives_0());
            }
            // InternalOCLinEcore.g:18752:1: ( rule__TypeExpCS__Alternatives_0 )
            // InternalOCLinEcore.g:18752:2: rule__TypeExpCS__Alternatives_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__TypeExpCS__Alternatives_0();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getTypeExpCSAccess().getAlternatives_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:18762: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:18766:1: ( rule__TypeExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:18767: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:18773: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:18777:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
            // InternalOCLinEcore.g:18778:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
            {
            // InternalOCLinEcore.g:18778:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
            // InternalOCLinEcore.g:18779:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
            }
            // InternalOCLinEcore.g:18780:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
            int alt196=2;
            int LA196_0 = input.LA(1);

            if ( (LA196_0==111) ) {
                alt196=1;
            }
            switch (alt196) {
                case 1 :
                    // InternalOCLinEcore.g:18780: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:18794: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:18798:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
            // InternalOCLinEcore.g:18799: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:18806: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:18810:1: ( ( rulePrefixedPrimaryExpCS ) )
            // InternalOCLinEcore.g:18811:1: ( rulePrefixedPrimaryExpCS )
            {
            // InternalOCLinEcore.g:18811:1: ( rulePrefixedPrimaryExpCS )
            // InternalOCLinEcore.g:18812: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:18823: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:18827:1: ( rule__ExpCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:18828: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:18834: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:18838:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
            // InternalOCLinEcore.g:18839:1: ( ( rule__ExpCS__Group_0_1__0 )? )
            {
            // InternalOCLinEcore.g:18839:1: ( ( rule__ExpCS__Group_0_1__0 )? )
            // InternalOCLinEcore.g:18840:1: ( rule__ExpCS__Group_0_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getGroup_0_1());
            }
            // InternalOCLinEcore.g:18841:1: ( rule__ExpCS__Group_0_1__0 )?
            int alt197=2;
            int LA197_0 = input.LA(1);

            if ( (LA197_0==60||(LA197_0>=62 && LA197_0<=78)) ) {
                alt197=1;
            }
            switch (alt197) {
                case 1 :
                    // InternalOCLinEcore.g:18841: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:18855: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:18859:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
            // InternalOCLinEcore.g:18860: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:18867: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:18871:1: ( ( () ) )
            // InternalOCLinEcore.g:18872:1: ( () )
            {
            // InternalOCLinEcore.g:18872:1: ( () )
            // InternalOCLinEcore.g:18873:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
            }
            // InternalOCLinEcore.g:18874:1: ()
            // InternalOCLinEcore.g:18876: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:18886: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:18890:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
            // InternalOCLinEcore.g:18891: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:18898: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:18902:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
            // InternalOCLinEcore.g:18903:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
            {
            // InternalOCLinEcore.g:18903:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
            // InternalOCLinEcore.g:18904:1: ( rule__ExpCS__NameAssignment_0_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
            }
            // InternalOCLinEcore.g:18905:1: ( rule__ExpCS__NameAssignment_0_1_1 )
            // InternalOCLinEcore.g:18905: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:18915: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:18919:1: ( rule__ExpCS__Group_0_1__2__Impl )
            // InternalOCLinEcore.g:18920: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:18926: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:18930:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
            // InternalOCLinEcore.g:18931:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
            {
            // InternalOCLinEcore.g:18931:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
            // InternalOCLinEcore.g:18932:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
            }
            // InternalOCLinEcore.g:18933:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
            // InternalOCLinEcore.g:18933: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:18949: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:18953:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
            // InternalOCLinEcore.g:18954: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:18961:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
    public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:18965:1: ( ( () ) )
            // InternalOCLinEcore.g:18966:1: ( () )
            {
            // InternalOCLinEcore.g:18966:1: ( () )
            // InternalOCLinEcore.g:18967:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
            }
            // InternalOCLinEcore.g:18968:1: ()
            // InternalOCLinEcore.g:18970: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:18980: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:18984:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
            // InternalOCLinEcore.g:18985: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:18992: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:18996:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:18997:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:18997:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
            // InternalOCLinEcore.g:18998:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
            }
            // InternalOCLinEcore.g:18999:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
            // InternalOCLinEcore.g:18999: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:19009: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:19013:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
            // InternalOCLinEcore.g:19014: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:19020: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:19024:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
            // InternalOCLinEcore.g:19025:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
            {
            // InternalOCLinEcore.g:19025:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
            // InternalOCLinEcore.g:19026:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
            }
            // InternalOCLinEcore.g:19027:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
            // InternalOCLinEcore.g:19027: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:19043: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:19047:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
            // InternalOCLinEcore.g:19048: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:19055:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
    public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19059:1: ( ( () ) )
            // InternalOCLinEcore.g:19060:1: ( () )
            {
            // InternalOCLinEcore.g:19060:1: ( () )
            // InternalOCLinEcore.g:19061:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
            }
            // InternalOCLinEcore.g:19062:1: ()
            // InternalOCLinEcore.g:19064: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:19074: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:19078:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
            // InternalOCLinEcore.g:19079: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:19086: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:19090:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
            // InternalOCLinEcore.g:19091:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
            {
            // InternalOCLinEcore.g:19091:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
            // InternalOCLinEcore.g:19092:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
            }
            // InternalOCLinEcore.g:19093:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
            // InternalOCLinEcore.g:19093: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:19103: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:19107:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
            // InternalOCLinEcore.g:19108: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:19114: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:19118:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
            // InternalOCLinEcore.g:19119:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
            {
            // InternalOCLinEcore.g:19119:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
            // InternalOCLinEcore.g:19120:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
            }
            // InternalOCLinEcore.g:19121:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
            // InternalOCLinEcore.g:19121: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:19137: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:19141:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
            // InternalOCLinEcore.g:19142: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:19149: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:19153:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
            // InternalOCLinEcore.g:19154:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:19154:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
            // InternalOCLinEcore.g:19155:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
            }
            // InternalOCLinEcore.g:19156:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
            // InternalOCLinEcore.g:19156: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:19166: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:19170:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
            // InternalOCLinEcore.g:19171: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:19178: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:19182:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
            // InternalOCLinEcore.g:19183:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
            {
            // InternalOCLinEcore.g:19183:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
            // InternalOCLinEcore.g:19184:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
            }
            // InternalOCLinEcore.g:19185:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
            loop198:
            do {
                int alt198=2;
                int LA198_0 = input.LA(1);

                if ( (LA198_0==111) ) {
                    alt198=1;
                }


                switch (alt198) {
            	case 1 :
            	    // InternalOCLinEcore.g:19185:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_106);
            	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();

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

            	    }
            	    break;

            	default :
            	    break loop198;
                }
            } 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:19195: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:19199:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
            // InternalOCLinEcore.g:19200: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:19207: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:19211:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
            // InternalOCLinEcore.g:19212:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
            {
            // InternalOCLinEcore.g:19212:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
            // InternalOCLinEcore.g:19213:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
            }
            // InternalOCLinEcore.g:19214:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
            int alt199=2;
            int LA199_0 = input.LA(1);

            if ( (LA199_0==96) ) {
                alt199=1;
            }
            switch (alt199) {
                case 1 :
                    // InternalOCLinEcore.g:19214: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:19224: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:19228:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
            // InternalOCLinEcore.g:19229: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:19236: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:19240:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
            // InternalOCLinEcore.g:19241:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
            {
            // InternalOCLinEcore.g:19241:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
            // InternalOCLinEcore.g:19242:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
            }
            // InternalOCLinEcore.g:19243:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
            int alt200=2;
            int LA200_0 = input.LA(1);

            if ( (LA200_0==100) ) {
                alt200=1;
            }
            switch (alt200) {
                case 1 :
                    // InternalOCLinEcore.g:19243: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:19253: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:19257:1: ( rule__NameExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:19258: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:19264: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:19268:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
            // InternalOCLinEcore.g:19269:1: ( ( rule__NameExpCS__Group_4__0 )? )
            {
            // InternalOCLinEcore.g:19269:1: ( ( rule__NameExpCS__Group_4__0 )? )
            // InternalOCLinEcore.g:19270:1: ( rule__NameExpCS__Group_4__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getGroup_4());
            }
            // InternalOCLinEcore.g:19271:1: ( rule__NameExpCS__Group_4__0 )?
            int alt201=2;
            int LA201_0 = input.LA(1);

            if ( (LA201_0==135) ) {
                alt201=1;
            }
            switch (alt201) {
                case 1 :
                    // InternalOCLinEcore.g:19271: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:19291: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:19295:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
            // InternalOCLinEcore.g:19296: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:19303: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:19307:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
            // InternalOCLinEcore.g:19308:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
            {
            // InternalOCLinEcore.g:19308:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
            // InternalOCLinEcore.g:19309:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
            }
            // InternalOCLinEcore.g:19310:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
            // InternalOCLinEcore.g:19310: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:19320: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:19324:1: ( rule__NameExpCS__Group_4__1__Impl )
            // InternalOCLinEcore.g:19325: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:19331: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:19335:1: ( ( 'pre' ) )
            // InternalOCLinEcore.g:19336:1: ( 'pre' )
            {
            // InternalOCLinEcore.g:19336:1: ( 'pre' )
            // InternalOCLinEcore.g:19337:1: 'pre'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
            }
            match(input,110,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:19354: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:19358:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:19359:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_89);
            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:19366:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
    public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19370:1: ( ( () ) )
            // InternalOCLinEcore.g:19371:1: ( () )
            {
            // InternalOCLinEcore.g:19371:1: ( () )
            // InternalOCLinEcore.g:19372:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
            }
            // InternalOCLinEcore.g:19373:1: ()
            // InternalOCLinEcore.g:19375: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:19385: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:19389:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:19390:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_18);
            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:19397:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
    public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19401:1: ( ( '{' ) )
            // InternalOCLinEcore.g:19402:1: ( '{' )
            {
            // InternalOCLinEcore.g:19402:1: ( '{' )
            // InternalOCLinEcore.g:19403:1: '{'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
            }
            match(input,100,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:19416: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:19420:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:19421:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_22);
            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:19428:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Alternatives_2 ) ) ;
    public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19432:1: ( ( ( rule__CurlyBracketedClauseCS__Alternatives_2 ) ) )
            // InternalOCLinEcore.g:19433:1: ( ( rule__CurlyBracketedClauseCS__Alternatives_2 ) )
            {
            // InternalOCLinEcore.g:19433:1: ( ( rule__CurlyBracketedClauseCS__Alternatives_2 ) )
            // InternalOCLinEcore.g:19434:1: ( rule__CurlyBracketedClauseCS__Alternatives_2 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:19435:1: ( rule__CurlyBracketedClauseCS__Alternatives_2 )
            // InternalOCLinEcore.g:19435:2: rule__CurlyBracketedClauseCS__Alternatives_2
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Alternatives_2();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getAlternatives_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:19445: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:19449:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:19450: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:19456:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
    public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19460:1: ( ( '}' ) )
            // InternalOCLinEcore.g:19461:1: ( '}' )
            {
            // InternalOCLinEcore.g:19461:1: ( '}' )
            // InternalOCLinEcore.g:19462:1: '}'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
            }
            match(input,101,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__0"
    // InternalOCLinEcore.g:19483:1: rule__CurlyBracketedClauseCS__Group_2_0__0 : rule__CurlyBracketedClauseCS__Group_2_0__0__Impl rule__CurlyBracketedClauseCS__Group_2_0__1 ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19487:1: ( rule__CurlyBracketedClauseCS__Group_2_0__0__Impl rule__CurlyBracketedClauseCS__Group_2_0__1 )
            // InternalOCLinEcore.g:19488:2: rule__CurlyBracketedClauseCS__Group_2_0__0__Impl rule__CurlyBracketedClauseCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__CurlyBracketedClauseCS__Group_2_0__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__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__CurlyBracketedClauseCS__Group_2_0__0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0__0__Impl"
    // InternalOCLinEcore.g:19495:1: rule__CurlyBracketedClauseCS__Group_2_0__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 ) ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19499:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 ) ) )
            // InternalOCLinEcore.g:19500:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 ) )
            {
            // InternalOCLinEcore.g:19500:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 ) )
            // InternalOCLinEcore.g:19501:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0_0());
            }
            // InternalOCLinEcore.g:19502:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 )
            // InternalOCLinEcore.g:19502:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0__1"
    // InternalOCLinEcore.g:19512:1: rule__CurlyBracketedClauseCS__Group_2_0__1 : rule__CurlyBracketedClauseCS__Group_2_0__1__Impl ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19516:1: ( rule__CurlyBracketedClauseCS__Group_2_0__1__Impl )
            // InternalOCLinEcore.g:19517:2: rule__CurlyBracketedClauseCS__Group_2_0__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__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__CurlyBracketedClauseCS__Group_2_0__1"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0__1__Impl"
    // InternalOCLinEcore.g:19523:1: rule__CurlyBracketedClauseCS__Group_2_0__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )* ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19527:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )* ) )
            // InternalOCLinEcore.g:19528:1: ( ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )* )
            {
            // InternalOCLinEcore.g:19528:1: ( ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )* )
            // InternalOCLinEcore.g:19529:1: ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_0_1());
            }
            // InternalOCLinEcore.g:19530:1: ( rule__CurlyBracketedClauseCS__Group_2_0_1__0 )*
            loop202:
            do {
                int alt202=2;
                int LA202_0 = input.LA(1);

                if ( (LA202_0==99) ) {
                    alt202=1;
                }


                switch (alt202) {
            	case 1 :
            	    // InternalOCLinEcore.g:19530:2: rule__CurlyBracketedClauseCS__Group_2_0_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__CurlyBracketedClauseCS__Group_2_0_1__0();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0_1__0"
    // InternalOCLinEcore.g:19544:1: rule__CurlyBracketedClauseCS__Group_2_0_1__0 : rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_0_1__1 ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0_1__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19548:1: ( rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_0_1__1 )
            // InternalOCLinEcore.g:19549:2: rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_0_1__1
            {
            pushFollow(FollowSets000.FOLLOW_7);
            rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2_0_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_0_1__0"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl"
    // InternalOCLinEcore.g:19556:1: rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl : ( ',' ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19560:1: ( ( ',' ) )
            // InternalOCLinEcore.g:19561:1: ( ',' )
            {
            // InternalOCLinEcore.g:19561:1: ( ',' )
            // InternalOCLinEcore.g:19562:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_0_1_0());
            }
            match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_0_1_0());
            }

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0_1__1"
    // InternalOCLinEcore.g:19575:1: rule__CurlyBracketedClauseCS__Group_2_0_1__1 : rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19579:1: ( rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl )
            // InternalOCLinEcore.g:19580:2: rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__Group_2_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__CurlyBracketedClauseCS__Group_2_0_1__1"


    // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl"
    // InternalOCLinEcore.g:19586:1: rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 ) ) ;
    public final void rule__CurlyBracketedClauseCS__Group_2_0_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19590:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 ) ) )
            // InternalOCLinEcore.g:19591:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 ) )
            {
            // InternalOCLinEcore.g:19591:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 ) )
            // InternalOCLinEcore.g:19592:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0_1_1());
            }
            // InternalOCLinEcore.g:19593:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1 )
            // InternalOCLinEcore.g:19593:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_1_1();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
    // InternalOCLinEcore.g:19607: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:19611:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:19612: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:19619:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
    public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19623:1: ( ( () ) )
            // InternalOCLinEcore.g:19624:1: ( () )
            {
            // InternalOCLinEcore.g:19624:1: ( () )
            // InternalOCLinEcore.g:19625:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
            }
            // InternalOCLinEcore.g:19626:1: ()
            // InternalOCLinEcore.g:19628: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:19638: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:19642:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:19643: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:19650:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
    public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19654:1: ( ( '(' ) )
            // InternalOCLinEcore.g:19655:1: ( '(' )
            {
            // InternalOCLinEcore.g:19655:1: ( '(' )
            // InternalOCLinEcore.g:19656:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
            }
            match(input,96,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:19669: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:19673:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:19674: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:19681: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:19685:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:19686:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:19686:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
            // InternalOCLinEcore.g:19687:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:19688:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
            int alt203=2;
            int LA203_0 = input.LA(1);

            if ( ((LA203_0>=RULE_INT && LA203_0<=RULE_SINGLE_QUOTED_STRING)||(LA203_0>=RULE_SIMPLE_ID && LA203_0<=RULE_ESCAPED_ID)||(LA203_0>=17 && LA203_0<=51)||(LA203_0>=54 && LA203_0<=62)||(LA203_0>=79 && LA203_0<=93)||LA203_0==96||LA203_0==98||LA203_0==106||(LA203_0>=108 && LA203_0<=109)||LA203_0==114||(LA203_0>=119 && LA203_0<=120)||(LA203_0>=133 && LA203_0<=134)) ) {
                alt203=1;
            }
            switch (alt203) {
                case 1 :
                    // InternalOCLinEcore.g:19688: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:19698: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:19702:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:19703: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:19709:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
    public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19713:1: ( ( ')' ) )
            // InternalOCLinEcore.g:19714:1: ( ')' )
            {
            // InternalOCLinEcore.g:19714:1: ( ')' )
            // InternalOCLinEcore.g:19715:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
            }
            match(input,97,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:19736: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:19740:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
            // InternalOCLinEcore.g:19741: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:19748: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:19752:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
            // InternalOCLinEcore.g:19753:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
            {
            // InternalOCLinEcore.g:19753:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
            // InternalOCLinEcore.g:19754:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
            }
            // InternalOCLinEcore.g:19755:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
            // InternalOCLinEcore.g:19755: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:19765:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl rule__RoundBracketedClauseCS__Group_2__2 ;
    public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19769:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl rule__RoundBracketedClauseCS__Group_2__2 )
            // InternalOCLinEcore.g:19770:2: rule__RoundBracketedClauseCS__Group_2__1__Impl rule__RoundBracketedClauseCS__Group_2__2
            {
            pushFollow(FollowSets000.FOLLOW_109);
            rule__RoundBracketedClauseCS__Group_2__1__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2__2();

            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:19777: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:19781:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
            // InternalOCLinEcore.g:19782:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
            {
            // InternalOCLinEcore.g:19782:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
            // InternalOCLinEcore.g:19783:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
            }
            // InternalOCLinEcore.g:19784:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
            loop204:
            do {
                int alt204=2;
                int LA204_0 = input.LA(1);

                if ( (LA204_0==99) ) {
                    alt204=1;
                }


                switch (alt204) {
            	case 1 :
            	    // InternalOCLinEcore.g:19784:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();

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

            	    }
            	    break;

            	default :
            	    break loop204;
                }
            } 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__RoundBracketedClauseCS__Group_2__2"
    // InternalOCLinEcore.g:19794:1: rule__RoundBracketedClauseCS__Group_2__2 : rule__RoundBracketedClauseCS__Group_2__2__Impl rule__RoundBracketedClauseCS__Group_2__3 ;
    public final void rule__RoundBracketedClauseCS__Group_2__2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19798:1: ( rule__RoundBracketedClauseCS__Group_2__2__Impl rule__RoundBracketedClauseCS__Group_2__3 )
            // InternalOCLinEcore.g:19799:2: rule__RoundBracketedClauseCS__Group_2__2__Impl rule__RoundBracketedClauseCS__Group_2__3
            {
            pushFollow(FollowSets000.FOLLOW_109);
            rule__RoundBracketedClauseCS__Group_2__2__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2__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__2"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__2__Impl"
    // InternalOCLinEcore.g:19806:1: rule__RoundBracketedClauseCS__Group_2__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2_2__0 )? ) ;
    public final void rule__RoundBracketedClauseCS__Group_2__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19810:1: ( ( ( rule__RoundBracketedClauseCS__Group_2_2__0 )? ) )
            // InternalOCLinEcore.g:19811:1: ( ( rule__RoundBracketedClauseCS__Group_2_2__0 )? )
            {
            // InternalOCLinEcore.g:19811:1: ( ( rule__RoundBracketedClauseCS__Group_2_2__0 )? )
            // InternalOCLinEcore.g:19812:1: ( rule__RoundBracketedClauseCS__Group_2_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:19813:1: ( rule__RoundBracketedClauseCS__Group_2_2__0 )?
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==52) ) {
                alt205=1;
            }
            switch (alt205) {
                case 1 :
                    // InternalOCLinEcore.g:19813:2: rule__RoundBracketedClauseCS__Group_2_2__0
                    {
                    pushFollow(FollowSets000.FOLLOW_2);
                    rule__RoundBracketedClauseCS__Group_2_2__0();

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

                    }
                    break;

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__3"
    // InternalOCLinEcore.g:19823:1: rule__RoundBracketedClauseCS__Group_2__3 : rule__RoundBracketedClauseCS__Group_2__3__Impl ;
    public final void rule__RoundBracketedClauseCS__Group_2__3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19827:1: ( rule__RoundBracketedClauseCS__Group_2__3__Impl )
            // InternalOCLinEcore.g:19828:2: rule__RoundBracketedClauseCS__Group_2__3__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2__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_2__3"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__3__Impl"
    // InternalOCLinEcore.g:19834:1: rule__RoundBracketedClauseCS__Group_2__3__Impl : ( ( rule__RoundBracketedClauseCS__Group_2_3__0 )* ) ;
    public final void rule__RoundBracketedClauseCS__Group_2__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19838:1: ( ( ( rule__RoundBracketedClauseCS__Group_2_3__0 )* ) )
            // InternalOCLinEcore.g:19839:1: ( ( rule__RoundBracketedClauseCS__Group_2_3__0 )* )
            {
            // InternalOCLinEcore.g:19839:1: ( ( rule__RoundBracketedClauseCS__Group_2_3__0 )* )
            // InternalOCLinEcore.g:19840:1: ( rule__RoundBracketedClauseCS__Group_2_3__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2_3());
            }
            // InternalOCLinEcore.g:19841:1: ( rule__RoundBracketedClauseCS__Group_2_3__0 )*
            loop206:
            do {
                int alt206=2;
                int LA206_0 = input.LA(1);

                if ( (LA206_0==136) ) {
                    alt206=1;
                }


                switch (alt206) {
            	case 1 :
            	    // InternalOCLinEcore.g:19841:2: rule__RoundBracketedClauseCS__Group_2_3__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_110);
            	    rule__RoundBracketedClauseCS__Group_2_3__0();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_2__0"
    // InternalOCLinEcore.g:19859:1: rule__RoundBracketedClauseCS__Group_2_2__0 : rule__RoundBracketedClauseCS__Group_2_2__0__Impl rule__RoundBracketedClauseCS__Group_2_2__1 ;
    public final void rule__RoundBracketedClauseCS__Group_2_2__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19863:1: ( rule__RoundBracketedClauseCS__Group_2_2__0__Impl rule__RoundBracketedClauseCS__Group_2_2__1 )
            // InternalOCLinEcore.g:19864:2: rule__RoundBracketedClauseCS__Group_2_2__0__Impl rule__RoundBracketedClauseCS__Group_2_2__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__RoundBracketedClauseCS__Group_2_2__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__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__RoundBracketedClauseCS__Group_2_2__0"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_2__0__Impl"
    // InternalOCLinEcore.g:19871:1: rule__RoundBracketedClauseCS__Group_2_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 ) ) ;
    public final void rule__RoundBracketedClauseCS__Group_2_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19875:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 ) ) )
            // InternalOCLinEcore.g:19876:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 ) )
            {
            // InternalOCLinEcore.g:19876:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 ) )
            // InternalOCLinEcore.g:19877:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_2_0());
            }
            // InternalOCLinEcore.g:19878:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 )
            // InternalOCLinEcore.g:19878:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_2__1"
    // InternalOCLinEcore.g:19888:1: rule__RoundBracketedClauseCS__Group_2_2__1 : rule__RoundBracketedClauseCS__Group_2_2__1__Impl ;
    public final void rule__RoundBracketedClauseCS__Group_2_2__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19892:1: ( rule__RoundBracketedClauseCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:19893:2: rule__RoundBracketedClauseCS__Group_2_2__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__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__RoundBracketedClauseCS__Group_2_2__1"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_2__1__Impl"
    // InternalOCLinEcore.g:19899:1: rule__RoundBracketedClauseCS__Group_2_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )* ) ;
    public final void rule__RoundBracketedClauseCS__Group_2_2__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19903:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )* ) )
            // InternalOCLinEcore.g:19904:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )* )
            {
            // InternalOCLinEcore.g:19904:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )* )
            // InternalOCLinEcore.g:19905:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:19906:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1 )*
            loop207:
            do {
                int alt207=2;
                int LA207_0 = input.LA(1);

                if ( (LA207_0==99) ) {
                    alt207=1;
                }


                switch (alt207) {
            	case 1 :
            	    // InternalOCLinEcore.g:19906:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_1();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_3__0"
    // InternalOCLinEcore.g:19920:1: rule__RoundBracketedClauseCS__Group_2_3__0 : rule__RoundBracketedClauseCS__Group_2_3__0__Impl rule__RoundBracketedClauseCS__Group_2_3__1 ;
    public final void rule__RoundBracketedClauseCS__Group_2_3__0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19924:1: ( rule__RoundBracketedClauseCS__Group_2_3__0__Impl rule__RoundBracketedClauseCS__Group_2_3__1 )
            // InternalOCLinEcore.g:19925:2: rule__RoundBracketedClauseCS__Group_2_3__0__Impl rule__RoundBracketedClauseCS__Group_2_3__1
            {
            pushFollow(FollowSets000.FOLLOW_32);
            rule__RoundBracketedClauseCS__Group_2_3__0__Impl();

            state._fsp--;
            if (state.failed) return ;
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2_3__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_3__0"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_3__0__Impl"
    // InternalOCLinEcore.g:19932:1: rule__RoundBracketedClauseCS__Group_2_3__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 ) ) ;
    public final void rule__RoundBracketedClauseCS__Group_2_3__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19936:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 ) ) )
            // InternalOCLinEcore.g:19937:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 ) )
            {
            // InternalOCLinEcore.g:19937:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 ) )
            // InternalOCLinEcore.g:19938:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_3_0());
            }
            // InternalOCLinEcore.g:19939:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0 )
            // InternalOCLinEcore.g:19939:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_3__1"
    // InternalOCLinEcore.g:19949:1: rule__RoundBracketedClauseCS__Group_2_3__1 : rule__RoundBracketedClauseCS__Group_2_3__1__Impl ;
    public final void rule__RoundBracketedClauseCS__Group_2_3__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19953:1: ( rule__RoundBracketedClauseCS__Group_2_3__1__Impl )
            // InternalOCLinEcore.g:19954:2: rule__RoundBracketedClauseCS__Group_2_3__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__RoundBracketedClauseCS__Group_2_3__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_3__1"


    // $ANTLR start "rule__RoundBracketedClauseCS__Group_2_3__1__Impl"
    // InternalOCLinEcore.g:19960:1: rule__RoundBracketedClauseCS__Group_2_3__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )* ) ;
    public final void rule__RoundBracketedClauseCS__Group_2_3__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19964:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )* ) )
            // InternalOCLinEcore.g:19965:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )* )
            {
            // InternalOCLinEcore.g:19965:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )* )
            // InternalOCLinEcore.g:19966:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_3_1());
            }
            // InternalOCLinEcore.g:19967:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1 )*
            loop208:
            do {
                int alt208=2;
                int LA208_0 = input.LA(1);

                if ( (LA208_0==99) ) {
                    alt208=1;
                }


                switch (alt208) {
            	case 1 :
            	    // InternalOCLinEcore.g:19967:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_3_1();

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

            	    }
            	    break;

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

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
    // InternalOCLinEcore.g:19981: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:19985:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
            // InternalOCLinEcore.g:19986: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:19993:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
    public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:19997:1: ( ( '[' ) )
            // InternalOCLinEcore.g:19998:1: ( '[' )
            {
            // InternalOCLinEcore.g:19998:1: ( '[' )
            // InternalOCLinEcore.g:19999:1: '['
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
            }
            match(input,111,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:20012: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:20016:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
            // InternalOCLinEcore.g:20017: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:20024: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:20028:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
            // InternalOCLinEcore.g:20029:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
            {
            // InternalOCLinEcore.g:20029:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
            // InternalOCLinEcore.g:20030:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
            }
            // InternalOCLinEcore.g:20031:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
            // InternalOCLinEcore.g:20031: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:20041: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:20045:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
            // InternalOCLinEcore.g:20046: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:20053: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:20057:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
            // InternalOCLinEcore.g:20058:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
            {
            // InternalOCLinEcore.g:20058:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
            // InternalOCLinEcore.g:20059:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:20060:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
            loop209:
            do {
                int alt209=2;
                int LA209_0 = input.LA(1);

                if ( (LA209_0==99) ) {
                    alt209=1;
                }


                switch (alt209) {
            	case 1 :
            	    // InternalOCLinEcore.g:20060:2: rule__SquareBracketedClauseCS__Group_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__SquareBracketedClauseCS__Group_2__0();

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

            	    }
            	    break;

            	default :
            	    break loop209;
                }
            } 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:20070: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:20074:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
            // InternalOCLinEcore.g:20075: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:20081:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
    public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20085:1: ( ( ']' ) )
            // InternalOCLinEcore.g:20086:1: ( ']' )
            {
            // InternalOCLinEcore.g:20086:1: ( ']' )
            // InternalOCLinEcore.g:20087:1: ']'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
            }
            match(input,112,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:20108: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:20112:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
            // InternalOCLinEcore.g:20113: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:20120:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
    public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20124:1: ( ( ',' ) )
            // InternalOCLinEcore.g:20125:1: ( ',' )
            {
            // InternalOCLinEcore.g:20125:1: ( ',' )
            // InternalOCLinEcore.g:20126:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
            }
            match(input,99,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:20139: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:20143:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:20144: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:20150: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:20154:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:20155:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:20155:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
            // InternalOCLinEcore.g:20156:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
            }
            // InternalOCLinEcore.g:20157:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
            // InternalOCLinEcore.g:20157: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:20171: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:20175:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
            // InternalOCLinEcore.g:20176: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:20183: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:20187:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
            // InternalOCLinEcore.g:20188:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
            {
            // InternalOCLinEcore.g:20188:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
            // InternalOCLinEcore.g:20189:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
            }
            // InternalOCLinEcore.g:20190:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
            // InternalOCLinEcore.g:20190: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:20200: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:20204:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
            // InternalOCLinEcore.g:20205: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:20211: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:20215:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
            // InternalOCLinEcore.g:20216:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
            {
            // InternalOCLinEcore.g:20216:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
            // InternalOCLinEcore.g:20217:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
            }
            // InternalOCLinEcore.g:20218:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( (LA210_0==98||LA210_0==113) ) {
                alt210=1;
            }
            switch (alt210) {
                case 1 :
                    // InternalOCLinEcore.g:20218: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:20232: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:20236:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
            // InternalOCLinEcore.g:20237:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            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:20244: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:20248:1: ( ( ':' ) )
            // InternalOCLinEcore.g:20249:1: ( ':' )
            {
            // InternalOCLinEcore.g:20249:1: ( ':' )
            // InternalOCLinEcore.g:20250:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_0_0());
            }
            match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_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:20263: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:20267:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
            // InternalOCLinEcore.g:20268: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:20275:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20279:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 ) ) )
            // InternalOCLinEcore.g:20280:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 ) )
            {
            // InternalOCLinEcore.g:20280:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 ) )
            // InternalOCLinEcore.g:20281:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_0_1());
            }
            // InternalOCLinEcore.g:20282:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 )
            // InternalOCLinEcore.g:20282:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_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:20292: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:20296:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
            // InternalOCLinEcore.g:20297: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:20303: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:20307:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
            // InternalOCLinEcore.g:20308:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
            {
            // InternalOCLinEcore.g:20308:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
            // InternalOCLinEcore.g:20309:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
            }
            // InternalOCLinEcore.g:20310:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
            int alt211=2;
            int LA211_0 = input.LA(1);

            if ( (LA211_0==69) ) {
                alt211=1;
            }
            switch (alt211) {
                case 1 :
                    // InternalOCLinEcore.g:20310: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:20326: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:20330:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
            // InternalOCLinEcore.g:20331: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:20338: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:20342:1: ( ( '=' ) )
            // InternalOCLinEcore.g:20343:1: ( '=' )
            {
            // InternalOCLinEcore.g:20343:1: ( '=' )
            // InternalOCLinEcore.g:20344:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
            }
            match(input,69,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:20357: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:20361:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
            // InternalOCLinEcore.g:20362: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:20368: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:20372:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
            // InternalOCLinEcore.g:20373:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
            {
            // InternalOCLinEcore.g:20373:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
            // InternalOCLinEcore.g:20374:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
            }
            // InternalOCLinEcore.g:20375:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
            // InternalOCLinEcore.g:20375: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:20389: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:20393:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
            // InternalOCLinEcore.g:20394:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            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:20401:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( 'in' ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20405:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:20406:1: ( 'in' )
            {
            // InternalOCLinEcore.g:20406:1: ( 'in' )
            // InternalOCLinEcore.g:20407:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_1_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getInKeyword_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:20420:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl ;
    public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20424:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl )
            // InternalOCLinEcore.g:20425:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__Group_0_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__NavigatingArgCS__Group_0_1_1__1"


    // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
    // InternalOCLinEcore.g:20431:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 ) ) ;
    public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20435:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 ) ) )
            // InternalOCLinEcore.g:20436:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 ) )
            {
            // InternalOCLinEcore.g:20436:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 ) )
            // InternalOCLinEcore.g:20437:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_1());
            }
            // InternalOCLinEcore.g:20438:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 )
            // InternalOCLinEcore.g:20438:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_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_1__0"
    // InternalOCLinEcore.g:20452: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:20456:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
            // InternalOCLinEcore.g:20457: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:20464:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
    public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20468:1: ( ( ':' ) )
            // InternalOCLinEcore.g:20469:1: ( ':' )
            {
            // InternalOCLinEcore.g:20469:1: ( ':' )
            // InternalOCLinEcore.g:20470:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
            }
            match(input,98,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:20483: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:20487:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:20488: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:20494: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:20498:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:20499:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:20499:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
            // InternalOCLinEcore.g:20500:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
            }
            // InternalOCLinEcore.g:20501:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
            // InternalOCLinEcore.g:20501: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:20515: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:20519:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
            // InternalOCLinEcore.g:20520: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:20527: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:20531:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:20532:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:20532:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:20533:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:20534:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:20534: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:20544: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:20548:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
            // InternalOCLinEcore.g:20549:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_52);
            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:20556: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:20560:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:20561:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:20561:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:20562:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:20563:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:20563: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:20573: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:20577:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:20578: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:20584: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:20588:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:20589:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:20589:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
            // InternalOCLinEcore.g:20590:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:20591:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
            int alt212=2;
            int LA212_0 = input.LA(1);

            if ( (LA212_0==98) ) {
                alt212=1;
            }
            switch (alt212) {
                case 1 :
                    // InternalOCLinEcore.g:20591: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:20607: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:20611:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
            // InternalOCLinEcore.g:20612: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:20619:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20623:1: ( ( ':' ) )
            // InternalOCLinEcore.g:20624:1: ( ':' )
            {
            // InternalOCLinEcore.g:20624:1: ( ':' )
            // InternalOCLinEcore.g:20625:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
            }
            match(input,98,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:20638: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:20642:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
            // InternalOCLinEcore.g:20643: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:20650: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:20654:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:20655:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:20655:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:20656:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:20657:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:20657: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:20667: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:20671:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:20672: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:20678: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:20682:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
            // InternalOCLinEcore.g:20683:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
            {
            // InternalOCLinEcore.g:20683:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
            // InternalOCLinEcore.g:20684:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:20685:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==69) ) {
                alt213=1;
            }
            switch (alt213) {
                case 1 :
                    // InternalOCLinEcore.g:20685: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:20701: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:20705:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
            // InternalOCLinEcore.g:20706: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:20713: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:20717:1: ( ( '=' ) )
            // InternalOCLinEcore.g:20718:1: ( '=' )
            {
            // InternalOCLinEcore.g:20718:1: ( '=' )
            // InternalOCLinEcore.g:20719:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
            }
            match(input,69,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:20732: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:20736:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:20737: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:20743: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:20747:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:20748:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:20748:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:20749:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:20750:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
            // InternalOCLinEcore.g:20750: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:20764: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:20768:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
            // InternalOCLinEcore.g:20769: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:20776: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:20780:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:20781:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:20781:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:20782:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:20783:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:20783: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:20793: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:20797:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
            // InternalOCLinEcore.g:20798: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:20805: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:20809:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:20810:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:20810:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:20811:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:20812:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:20812: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:20822: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:20826:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:20827: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:20833: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:20837:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
            // InternalOCLinEcore.g:20838:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
            {
            // InternalOCLinEcore.g:20838:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
            // InternalOCLinEcore.g:20839:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:20840:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
            int alt214=2;
            int LA214_0 = input.LA(1);

            if ( (LA214_0==98||LA214_0==113) ) {
                alt214=1;
            }
            switch (alt214) {
                case 1 :
                    // InternalOCLinEcore.g:20840: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:20856: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:20860:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
            // InternalOCLinEcore.g:20861:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
            {
            pushFollow(FollowSets000.FOLLOW_28);
            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:20868: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:20872:1: ( ( ':' ) )
            // InternalOCLinEcore.g:20873:1: ( ':' )
            {
            // InternalOCLinEcore.g:20873:1: ( ':' )
            // InternalOCLinEcore.g:20874:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_0_0());
            }
            match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_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:20887: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:20891:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
            // InternalOCLinEcore.g:20892: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:20899:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:20903:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 ) ) )
            // InternalOCLinEcore.g:20904:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 ) )
            {
            // InternalOCLinEcore.g:20904:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 ) )
            // InternalOCLinEcore.g:20905:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_0_1());
            }
            // InternalOCLinEcore.g:20906:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 )
            // InternalOCLinEcore.g:20906:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_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:20916: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:20920:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
            // InternalOCLinEcore.g:20921: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:20927: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:20931:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
            // InternalOCLinEcore.g:20932:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
            {
            // InternalOCLinEcore.g:20932:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
            // InternalOCLinEcore.g:20933:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
            }
            // InternalOCLinEcore.g:20934:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==69) ) {
                alt215=1;
            }
            switch (alt215) {
                case 1 :
                    // InternalOCLinEcore.g:20934: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:20950: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:20954:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
            // InternalOCLinEcore.g:20955: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:20962: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:20966:1: ( ( '=' ) )
            // InternalOCLinEcore.g:20967:1: ( '=' )
            {
            // InternalOCLinEcore.g:20967:1: ( '=' )
            // InternalOCLinEcore.g:20968:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
            }
            match(input,69,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:20981: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:20985:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
            // InternalOCLinEcore.g:20986: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:20992: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:20996:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
            // InternalOCLinEcore.g:20997:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
            {
            // InternalOCLinEcore.g:20997:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
            // InternalOCLinEcore.g:20998:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
            }
            // InternalOCLinEcore.g:20999:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
            // InternalOCLinEcore.g:20999: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:21013: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:21017:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
            // InternalOCLinEcore.g:21018:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
            {
            pushFollow(FollowSets000.FOLLOW_93);
            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:21025:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( 'in' ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21029:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:21030:1: ( 'in' )
            {
            // InternalOCLinEcore.g:21030:1: ( 'in' )
            // InternalOCLinEcore.g:21031:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_1_0());
            }
            match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_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:21044:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21048:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl )
            // InternalOCLinEcore.g:21049:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__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__NavigatingCommaArgCS__Group_2_1__1"


    // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
    // InternalOCLinEcore.g:21055:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 ) ) ;
    public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21059:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 ) ) )
            // InternalOCLinEcore.g:21060:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 ) )
            {
            // InternalOCLinEcore.g:21060:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 ) )
            // InternalOCLinEcore.g:21061:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_1());
            }
            // InternalOCLinEcore.g:21062:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 )
            // InternalOCLinEcore.g:21062:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1();

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

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_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__NavigatingSemiArgCS__Group__0"
    // InternalOCLinEcore.g:21076: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:21080:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
            // InternalOCLinEcore.g:21081: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:21088: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:21092:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
            // InternalOCLinEcore.g:21093:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
            {
            // InternalOCLinEcore.g:21093:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
            // InternalOCLinEcore.g:21094:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
            }
            // InternalOCLinEcore.g:21095:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
            // InternalOCLinEcore.g:21095: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:21105: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:21109:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
            // InternalOCLinEcore.g:21110:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_52);
            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:21117: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:21121:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:21122:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21122:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:21123:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:21124:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
            // InternalOCLinEcore.g:21124: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:21134: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:21138:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
            // InternalOCLinEcore.g:21139: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:21145: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:21149:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:21150:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:21150:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
            // InternalOCLinEcore.g:21151:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:21152:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
            int alt216=2;
            int LA216_0 = input.LA(1);

            if ( (LA216_0==98) ) {
                alt216=1;
            }
            switch (alt216) {
                case 1 :
                    // InternalOCLinEcore.g:21152: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:21168: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:21172:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
            // InternalOCLinEcore.g:21173: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:21180:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21184:1: ( ( ':' ) )
            // InternalOCLinEcore.g:21185:1: ( ':' )
            {
            // InternalOCLinEcore.g:21185:1: ( ':' )
            // InternalOCLinEcore.g:21186:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
            }
            match(input,98,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:21199: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:21203:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
            // InternalOCLinEcore.g:21204: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:21211: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:21215:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:21216:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:21216:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:21217:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:21218:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:21218: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:21228: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:21232:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
            // InternalOCLinEcore.g:21233: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:21239: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:21243:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
            // InternalOCLinEcore.g:21244:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
            {
            // InternalOCLinEcore.g:21244:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
            // InternalOCLinEcore.g:21245:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
            }
            // InternalOCLinEcore.g:21246:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==69) ) {
                alt217=1;
            }
            switch (alt217) {
                case 1 :
                    // InternalOCLinEcore.g:21246: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:21262: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:21266:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
            // InternalOCLinEcore.g:21267: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:21274: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:21278:1: ( ( '=' ) )
            // InternalOCLinEcore.g:21279:1: ( '=' )
            {
            // InternalOCLinEcore.g:21279:1: ( '=' )
            // InternalOCLinEcore.g:21280:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
            }
            match(input,69,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:21293: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:21297:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
            // InternalOCLinEcore.g:21298: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:21304: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:21308:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
            // InternalOCLinEcore.g:21309:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            {
            // InternalOCLinEcore.g:21309:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
            // InternalOCLinEcore.g:21310:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
            }
            // InternalOCLinEcore.g:21311:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
            // InternalOCLinEcore.g:21311: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__IfExpCS__Group__0"
    // InternalOCLinEcore.g:21325: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:21329:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
            // InternalOCLinEcore.g:21330: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:21337:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
    public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21341:1: ( ( 'if' ) )
            // InternalOCLinEcore.g:21342:1: ( 'if' )
            {
            // InternalOCLinEcore.g:21342:1: ( 'if' )
            // InternalOCLinEcore.g:21343:1: 'if'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
            }
            match(input,114,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:21356: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:21360:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
            // InternalOCLinEcore.g:21361:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_113);
            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:21368: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:21372:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
            // InternalOCLinEcore.g:21373:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21373:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
            // InternalOCLinEcore.g:21374:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
            }
            // InternalOCLinEcore.g:21375:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
            // InternalOCLinEcore.g:21375: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:21385: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:21389:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
            // InternalOCLinEcore.g:21390: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:21397:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
    public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21401:1: ( ( 'then' ) )
            // InternalOCLinEcore.g:21402:1: ( 'then' )
            {
            // InternalOCLinEcore.g:21402:1: ( 'then' )
            // InternalOCLinEcore.g:21403:1: 'then'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
            }
            match(input,115,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:21416: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:21420:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
            // InternalOCLinEcore.g:21421:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
            {
            pushFollow(FollowSets000.FOLLOW_114);
            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:21428: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:21432:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:21433:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:21433:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:21434:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:21435:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
            // InternalOCLinEcore.g:21435: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:21445: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:21449:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
            // InternalOCLinEcore.g:21450:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
            {
            pushFollow(FollowSets000.FOLLOW_114);
            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:21457: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:21461:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
            // InternalOCLinEcore.g:21462:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
            {
            // InternalOCLinEcore.g:21462:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
            // InternalOCLinEcore.g:21463:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
            }
            // InternalOCLinEcore.g:21464:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
            loop218:
            do {
                int alt218=2;
                int LA218_0 = input.LA(1);

                if ( (LA218_0==118) ) {
                    alt218=1;
                }


                switch (alt218) {
            	case 1 :
            	    // InternalOCLinEcore.g:21464:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
            	    {
            	    pushFollow(FollowSets000.FOLLOW_115);
            	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();

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

            	    }
            	    break;

            	default :
            	    break loop218;
                }
            } 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:21474: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:21478:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
            // InternalOCLinEcore.g:21479: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:21486:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
    public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21490:1: ( ( 'else' ) )
            // InternalOCLinEcore.g:21491:1: ( 'else' )
            {
            // InternalOCLinEcore.g:21491:1: ( 'else' )
            // InternalOCLinEcore.g:21492:1: 'else'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
            }
            match(input,116,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:21505: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:21509:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
            // InternalOCLinEcore.g:21510:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
            {
            pushFollow(FollowSets000.FOLLOW_116);
            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:21517: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:21521:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
            // InternalOCLinEcore.g:21522:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
            {
            // InternalOCLinEcore.g:21522:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
            // InternalOCLinEcore.g:21523:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
            }
            // InternalOCLinEcore.g:21524:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
            // InternalOCLinEcore.g:21524: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:21534: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:21538:1: ( rule__IfExpCS__Group__7__Impl )
            // InternalOCLinEcore.g:21539: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:21545:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
    public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21549:1: ( ( 'endif' ) )
            // InternalOCLinEcore.g:21550:1: ( 'endif' )
            {
            // InternalOCLinEcore.g:21550:1: ( 'endif' )
            // InternalOCLinEcore.g:21551:1: 'endif'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
            }
            match(input,117,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:21580: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:21584:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
            // InternalOCLinEcore.g:21585: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:21592:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
    public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21596:1: ( ( 'elseif' ) )
            // InternalOCLinEcore.g:21597:1: ( 'elseif' )
            {
            // InternalOCLinEcore.g:21597:1: ( 'elseif' )
            // InternalOCLinEcore.g:21598:1: 'elseif'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
            }
            match(input,118,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:21611: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:21615:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
            // InternalOCLinEcore.g:21616:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_113);
            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:21623: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:21627:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
            // InternalOCLinEcore.g:21628:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21628:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
            // InternalOCLinEcore.g:21629:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
            }
            // InternalOCLinEcore.g:21630:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
            // InternalOCLinEcore.g:21630: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:21640: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:21644:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
            // InternalOCLinEcore.g:21645: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:21652:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
    public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21656:1: ( ( 'then' ) )
            // InternalOCLinEcore.g:21657:1: ( 'then' )
            {
            // InternalOCLinEcore.g:21657:1: ( 'then' )
            // InternalOCLinEcore.g:21658:1: 'then'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
            }
            match(input,115,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:21671: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:21675:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
            // InternalOCLinEcore.g:21676: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:21682: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:21686:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
            // InternalOCLinEcore.g:21687:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
            {
            // InternalOCLinEcore.g:21687:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
            // InternalOCLinEcore.g:21688:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
            }
            // InternalOCLinEcore.g:21689:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
            // InternalOCLinEcore.g:21689: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:21707: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:21711:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
            // InternalOCLinEcore.g:21712: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:21719:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
    public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21723:1: ( ( 'let' ) )
            // InternalOCLinEcore.g:21724:1: ( 'let' )
            {
            // InternalOCLinEcore.g:21724:1: ( 'let' )
            // InternalOCLinEcore.g:21725:1: 'let'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
            }
            match(input,119,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:21738: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:21742:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
            // InternalOCLinEcore.g:21743:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_117);
            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:21750: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:21754:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
            // InternalOCLinEcore.g:21755:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
            {
            // InternalOCLinEcore.g:21755:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
            // InternalOCLinEcore.g:21756:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
            }
            // InternalOCLinEcore.g:21757:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
            // InternalOCLinEcore.g:21757: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:21767: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:21771:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
            // InternalOCLinEcore.g:21772:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_117);
            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:21779: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:21783:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
            // InternalOCLinEcore.g:21784:1: ( ( rule__LetExpCS__Group_2__0 )* )
            {
            // InternalOCLinEcore.g:21784:1: ( ( rule__LetExpCS__Group_2__0 )* )
            // InternalOCLinEcore.g:21785:1: ( rule__LetExpCS__Group_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:21786:1: ( rule__LetExpCS__Group_2__0 )*
            loop219:
            do {
                int alt219=2;
                int LA219_0 = input.LA(1);

                if ( (LA219_0==99) ) {
                    alt219=1;
                }


                switch (alt219) {
            	case 1 :
            	    // InternalOCLinEcore.g:21786:2: rule__LetExpCS__Group_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__LetExpCS__Group_2__0();

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

            	    }
            	    break;

            	default :
            	    break loop219;
                }
            } 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:21796: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:21800:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
            // InternalOCLinEcore.g:21801: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:21808:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
    public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21812:1: ( ( 'in' ) )
            // InternalOCLinEcore.g:21813:1: ( 'in' )
            {
            // InternalOCLinEcore.g:21813:1: ( 'in' )
            // InternalOCLinEcore.g:21814:1: 'in'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
            }
            match(input,113,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:21827: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:21831:1: ( rule__LetExpCS__Group__4__Impl )
            // InternalOCLinEcore.g:21832: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:21838: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:21842:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
            // InternalOCLinEcore.g:21843:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
            {
            // InternalOCLinEcore.g:21843:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
            // InternalOCLinEcore.g:21844:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
            }
            // InternalOCLinEcore.g:21845:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
            // InternalOCLinEcore.g:21845: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:21865: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:21869:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
            // InternalOCLinEcore.g:21870: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:21877:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
    public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:21881:1: ( ( ',' ) )
            // InternalOCLinEcore.g:21882:1: ( ',' )
            {
            // InternalOCLinEcore.g:21882:1: ( ',' )
            // InternalOCLinEcore.g:21883:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
            }
            match(input,99,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:21896: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:21900:1: ( rule__LetExpCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:21901: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:21907: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:21911:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:21912:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:21912:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
            // InternalOCLinEcore.g:21913:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
            }
            // InternalOCLinEcore.g:21914:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
            // InternalOCLinEcore.g:21914: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:21928: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:21932:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
            // InternalOCLinEcore.g:21933:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_118);
            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:21940: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:21944:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:21945:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:21945:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:21946:1: ( rule__LetVariableCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:21947:1: ( rule__LetVariableCS__NameAssignment_0 )
            // InternalOCLinEcore.g:21947: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:21957: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:21961:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
            // InternalOCLinEcore.g:21962:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_118);
            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:21969: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:21973:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
            // InternalOCLinEcore.g:21974:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
            {
            // InternalOCLinEcore.g:21974:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
            // InternalOCLinEcore.g:21975:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
            }
            // InternalOCLinEcore.g:21976:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
            int alt220=2;
            int LA220_0 = input.LA(1);

            if ( (LA220_0==96) ) {
                alt220=1;
            }
            switch (alt220) {
                case 1 :
                    // InternalOCLinEcore.g:21976: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:21986: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:21990:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
            // InternalOCLinEcore.g:21991:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_118);
            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:21998: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:22002:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:22003:1: ( ( rule__LetVariableCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:22003:1: ( ( rule__LetVariableCS__Group_2__0 )? )
            // InternalOCLinEcore.g:22004:1: ( rule__LetVariableCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:22005:1: ( rule__LetVariableCS__Group_2__0 )?
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( (LA221_0==98) ) {
                alt221=1;
            }
            switch (alt221) {
                case 1 :
                    // InternalOCLinEcore.g:22005: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:22015: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:22019:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
            // InternalOCLinEcore.g:22020: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:22027:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
    public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22031:1: ( ( '=' ) )
            // InternalOCLinEcore.g:22032:1: ( '=' )
            {
            // InternalOCLinEcore.g:22032:1: ( '=' )
            // InternalOCLinEcore.g:22033:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
            }
            match(input,69,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:22046: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:22050:1: ( rule__LetVariableCS__Group__4__Impl )
            // InternalOCLinEcore.g:22051: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:22057: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:22061:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
            // InternalOCLinEcore.g:22062:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
            {
            // InternalOCLinEcore.g:22062:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
            // InternalOCLinEcore.g:22063:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
            }
            // InternalOCLinEcore.g:22064:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
            // InternalOCLinEcore.g:22064: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:22084: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:22088:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
            // InternalOCLinEcore.g:22089: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:22096:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
    public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22100:1: ( ( ':' ) )
            // InternalOCLinEcore.g:22101:1: ( ':' )
            {
            // InternalOCLinEcore.g:22101:1: ( ':' )
            // InternalOCLinEcore.g:22102:1: ':'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
            }
            match(input,98,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:22115: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:22119:1: ( rule__LetVariableCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:22120: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:22126: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:22130:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:22131:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:22131:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
            // InternalOCLinEcore.g:22132:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
            }
            // InternalOCLinEcore.g:22133:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
            // InternalOCLinEcore.g:22133: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:22147: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:22151:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
            // InternalOCLinEcore.g:22152: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:22159:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
    public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22163:1: ( ( '(' ) )
            // InternalOCLinEcore.g:22164:1: ( '(' )
            {
            // InternalOCLinEcore.g:22164:1: ( '(' )
            // InternalOCLinEcore.g:22165:1: '('
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
            }
            match(input,96,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:22178: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:22182:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
            // InternalOCLinEcore.g:22183: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:22190: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:22194:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
            // InternalOCLinEcore.g:22195:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
            {
            // InternalOCLinEcore.g:22195:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
            // InternalOCLinEcore.g:22196:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
            }
            // InternalOCLinEcore.g:22197:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
            // InternalOCLinEcore.g:22197: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:22207: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:22211:1: ( rule__NestedExpCS__Group__2__Impl )
            // InternalOCLinEcore.g:22212: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:22218:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
    public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22222:1: ( ( ')' ) )
            // InternalOCLinEcore.g:22223:1: ( ')' )
            {
            // InternalOCLinEcore.g:22223:1: ( ')' )
            // InternalOCLinEcore.g:22224:1: ')'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
            }
            match(input,97,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:22243: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:22247:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
            // InternalOCLinEcore.g:22248:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_119);
            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:22255:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
    public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22259:1: ( ( () ) )
            // InternalOCLinEcore.g:22260:1: ( () )
            {
            // InternalOCLinEcore.g:22260:1: ( () )
            // InternalOCLinEcore.g:22261:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
            }
            // InternalOCLinEcore.g:22262:1: ()
            // InternalOCLinEcore.g:22264: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:22274: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:22278:1: ( rule__SelfExpCS__Group__1__Impl )
            // InternalOCLinEcore.g:22279: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:22285:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
    public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22289:1: ( ( 'self' ) )
            // InternalOCLinEcore.g:22290:1: ( 'self' )
            {
            // InternalOCLinEcore.g:22290:1: ( 'self' )
            // InternalOCLinEcore.g:22291:1: 'self'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
            }
            match(input,120,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:22308: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:22312:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
            // InternalOCLinEcore.g:22313: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:22320: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:22324:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
            // InternalOCLinEcore.g:22325:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22325:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
            // InternalOCLinEcore.g:22326:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
            }
            // InternalOCLinEcore.g:22327:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
            // InternalOCLinEcore.g:22327: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:22337: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:22341:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
            // InternalOCLinEcore.g:22342: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:22348: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:22352:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:22353:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:22353:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
            // InternalOCLinEcore.g:22354:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:22355:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==104) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // InternalOCLinEcore.g:22355: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:22369: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:22373:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
            // InternalOCLinEcore.g:22374:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
            {
            pushFollow(FollowSets000.FOLLOW_120);
            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:22381:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
    public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22385:1: ( ( '..' ) )
            // InternalOCLinEcore.g:22386:1: ( '..' )
            {
            // InternalOCLinEcore.g:22386:1: ( '..' )
            // InternalOCLinEcore.g:22387:1: '..'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
            }
            match(input,104,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:22400: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:22404:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:22405: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:22411: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:22415:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:22416:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:22416:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
            // InternalOCLinEcore.g:22417:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
            }
            // InternalOCLinEcore.g:22418:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
            // InternalOCLinEcore.g:22418: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:22432: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:22436:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
            // InternalOCLinEcore.g:22437:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_121);
            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:22444:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
    public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22448:1: ( ( '[' ) )
            // InternalOCLinEcore.g:22449:1: ( '[' )
            {
            // InternalOCLinEcore.g:22449:1: ( '[' )
            // InternalOCLinEcore.g:22450:1: '['
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
            }
            match(input,111,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:22463: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:22467:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
            // InternalOCLinEcore.g:22468:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_122);
            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:22475: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:22479:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
            // InternalOCLinEcore.g:22480:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
            {
            // InternalOCLinEcore.g:22480:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
            // InternalOCLinEcore.g:22481:1: ( rule__MultiplicityCS__Alternatives_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
            }
            // InternalOCLinEcore.g:22482:1: ( rule__MultiplicityCS__Alternatives_1 )
            // InternalOCLinEcore.g:22482: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:22492: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:22496:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
            // InternalOCLinEcore.g:22497:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
            {
            pushFollow(FollowSets000.FOLLOW_122);
            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:22504: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:22508:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
            // InternalOCLinEcore.g:22509:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
            {
            // InternalOCLinEcore.g:22509:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
            // InternalOCLinEcore.g:22510:1: ( rule__MultiplicityCS__Alternatives_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
            }
            // InternalOCLinEcore.g:22511:1: ( rule__MultiplicityCS__Alternatives_2 )?
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==94||LA223_0==137) ) {
                alt223=1;
            }
            switch (alt223) {
                case 1 :
                    // InternalOCLinEcore.g:22511: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:22521: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:22525:1: ( rule__MultiplicityCS__Group__3__Impl )
            // InternalOCLinEcore.g:22526: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:22532:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
    public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22536:1: ( ( ']' ) )
            // InternalOCLinEcore.g:22537:1: ( ']' )
            {
            // InternalOCLinEcore.g:22537:1: ( ']' )
            // InternalOCLinEcore.g:22538:1: ']'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
            }
            match(input,112,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:22559: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:22563:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
            // InternalOCLinEcore.g:22564: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:22571: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:22575:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
            // InternalOCLinEcore.g:22576:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22576:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
            // InternalOCLinEcore.g:22577:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
            }
            // InternalOCLinEcore.g:22578:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
            // InternalOCLinEcore.g:22578: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:22588: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:22592:1: ( rule__PathNameCS__Group__1__Impl )
            // InternalOCLinEcore.g:22593: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:22599: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:22603:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:22604:1: ( ( rule__PathNameCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:22604:1: ( ( rule__PathNameCS__Group_1__0 )* )
            // InternalOCLinEcore.g:22605:1: ( rule__PathNameCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:22606:1: ( rule__PathNameCS__Group_1__0 )*
            loop224:
            do {
                int alt224=2;
                int LA224_0 = input.LA(1);

                if ( (LA224_0==103) ) {
                    alt224=1;
                }


                switch (alt224) {
            	case 1 :
            	    // InternalOCLinEcore.g:22606:2: rule__PathNameCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_87);
            	    rule__PathNameCS__Group_1__0();

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

            	    }
            	    break;

            	default :
            	    break loop224;
                }
            } 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:22620: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:22624:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
            // InternalOCLinEcore.g:22625: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:22632:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
    public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22636:1: ( ( '::' ) )
            // InternalOCLinEcore.g:22637:1: ( '::' )
            {
            // InternalOCLinEcore.g:22637:1: ( '::' )
            // InternalOCLinEcore.g:22638:1: '::'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
            }
            match(input,103,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:22651: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:22655:1: ( rule__PathNameCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:22656: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:22662: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:22666:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:22667:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:22667:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
            // InternalOCLinEcore.g:22668:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
            }
            // InternalOCLinEcore.g:22669:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
            // InternalOCLinEcore.g:22669: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:22683: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:22687:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
            // InternalOCLinEcore.g:22688:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_123);
            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:22695: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:22699:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
            // InternalOCLinEcore.g:22700:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22700:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
            // InternalOCLinEcore.g:22701:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
            }
            // InternalOCLinEcore.g:22702:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
            // InternalOCLinEcore.g:22702: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:22712: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:22716:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
            // InternalOCLinEcore.g:22717:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_123);
            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:22724: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:22728:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
            // InternalOCLinEcore.g:22729:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
            {
            // InternalOCLinEcore.g:22729:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
            // InternalOCLinEcore.g:22730:1: ( rule__TemplateBindingCS__Group_1__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:22731:1: ( rule__TemplateBindingCS__Group_1__0 )*
            loop225:
            do {
                int alt225=2;
                int LA225_0 = input.LA(1);

                if ( (LA225_0==99) ) {
                    alt225=1;
                }


                switch (alt225) {
            	case 1 :
            	    // InternalOCLinEcore.g:22731:2: rule__TemplateBindingCS__Group_1__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_20);
            	    rule__TemplateBindingCS__Group_1__0();

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

            	    }
            	    break;

            	default :
            	    break loop225;
                }
            } 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:22741: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:22745:1: ( rule__TemplateBindingCS__Group__2__Impl )
            // InternalOCLinEcore.g:22746: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:22752: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:22756:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
            // InternalOCLinEcore.g:22757:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
            {
            // InternalOCLinEcore.g:22757:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
            // InternalOCLinEcore.g:22758:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
            }
            // InternalOCLinEcore.g:22759:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
            int alt226=2;
            int LA226_0 = input.LA(1);

            if ( (LA226_0==111) ) {
                alt226=1;
            }
            switch (alt226) {
                case 1 :
                    // InternalOCLinEcore.g:22759: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:22775: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:22779:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
            // InternalOCLinEcore.g:22780: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:22787:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
    public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:22791:1: ( ( ',' ) )
            // InternalOCLinEcore.g:22792:1: ( ',' )
            {
            // InternalOCLinEcore.g:22792:1: ( ',' )
            // InternalOCLinEcore.g:22793:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
            }
            match(input,99,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:22806: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:22810:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
            // InternalOCLinEcore.g:22811: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:22817: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:22821:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:22822:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:22822:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
            // InternalOCLinEcore.g:22823:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
            }
            // InternalOCLinEcore.g:22824:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
            // InternalOCLinEcore.g:22824: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:22838: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:22842:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
            // InternalOCLinEcore.g:22843:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
            {
            pushFollow(FollowSets000.FOLLOW_124);
            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:22850: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:22854:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
            // InternalOCLinEcore.g:22855:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
            {
            // InternalOCLinEcore.g:22855:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
            // InternalOCLinEcore.g:22856:1: ( rule__TypeParameterCS__NameAssignment_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
            }
            // InternalOCLinEcore.g:22857:1: ( rule__TypeParameterCS__NameAssignment_0 )
            // InternalOCLinEcore.g:22857: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:22867: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:22871:1: ( rule__TypeParameterCS__Group__1__Impl )
            // InternalOCLinEcore.g:22872: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:22878: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:22882:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
            // InternalOCLinEcore.g:22883:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
            {
            // InternalOCLinEcore.g:22883:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
            // InternalOCLinEcore.g:22884:1: ( rule__TypeParameterCS__Group_1__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
            }
            // InternalOCLinEcore.g:22885:1: ( rule__TypeParameterCS__Group_1__0 )?
            int alt227=2;
            int LA227_0 = input.LA(1);

            if ( (LA227_0==28) ) {
                alt227=1;
            }
            switch (alt227) {
                case 1 :
                    // InternalOCLinEcore.g:22885: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:22899: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:22903:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
            // InternalOCLinEcore.g:22904: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:22911: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:22915:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:22916:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:22916:1: ( 'extends' )
            // InternalOCLinEcore.g:22917: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:22930: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:22934:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
            // InternalOCLinEcore.g:22935:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
            {
            pushFollow(FollowSets000.FOLLOW_125);
            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:22942: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:22946:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
            // InternalOCLinEcore.g:22947:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
            {
            // InternalOCLinEcore.g:22947:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
            // InternalOCLinEcore.g:22948:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
            }
            // InternalOCLinEcore.g:22949:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
            // InternalOCLinEcore.g:22949: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:22959: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:22963:1: ( rule__TypeParameterCS__Group_1__2__Impl )
            // InternalOCLinEcore.g:22964: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:22970: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:22974:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
            // InternalOCLinEcore.g:22975:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
            {
            // InternalOCLinEcore.g:22975:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
            // InternalOCLinEcore.g:22976:1: ( rule__TypeParameterCS__Group_1_2__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
            }
            // InternalOCLinEcore.g:22977:1: ( rule__TypeParameterCS__Group_1_2__0 )*
            loop228:
            do {
                int alt228=2;
                int LA228_0 = input.LA(1);

                if ( (LA228_0==121) ) {
                    alt228=1;
                }


                switch (alt228) {
            	case 1 :
            	    // InternalOCLinEcore.g:22977:2: rule__TypeParameterCS__Group_1_2__0
            	    {
            	    pushFollow(FollowSets000.FOLLOW_126);
            	    rule__TypeParameterCS__Group_1_2__0();

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

            	    }
            	    break;

            	default :
            	    break loop228;
                }
            } 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:22993: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:22997:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
            // InternalOCLinEcore.g:22998: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:23005: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:23009:1: ( ( '&&' ) )
            // InternalOCLinEcore.g:23010:1: ( '&&' )
            {
            // InternalOCLinEcore.g:23010:1: ( '&&' )
            // InternalOCLinEcore.g:23011:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
            }
            match(input,121,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:23024: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:23028:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
            // InternalOCLinEcore.g:23029: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:23035: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:23039:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
            // InternalOCLinEcore.g:23040:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
            {
            // InternalOCLinEcore.g:23040:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
            // InternalOCLinEcore.g:23041:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
            }
            // InternalOCLinEcore.g:23042:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
            // InternalOCLinEcore.g:23042: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:23056: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:23060:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
            // InternalOCLinEcore.g:23061: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:23068:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
    public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23072:1: ( ( () ) )
            // InternalOCLinEcore.g:23073:1: ( () )
            {
            // InternalOCLinEcore.g:23073:1: ( () )
            // InternalOCLinEcore.g:23074:1: ()
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
            }
            // InternalOCLinEcore.g:23075:1: ()
            // InternalOCLinEcore.g:23077: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:23087: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:23091:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
            // InternalOCLinEcore.g:23092:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
            {
            pushFollow(FollowSets000.FOLLOW_124);
            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:23099:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
    public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23103:1: ( ( '?' ) )
            // InternalOCLinEcore.g:23104:1: ( '?' )
            {
            // InternalOCLinEcore.g:23104:1: ( '?' )
            // InternalOCLinEcore.g:23105:1: '?'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
            }
            match(input,95,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:23118: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:23122:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
            // InternalOCLinEcore.g:23123: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:23129: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:23133:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
            // InternalOCLinEcore.g:23134:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
            {
            // InternalOCLinEcore.g:23134:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
            // InternalOCLinEcore.g:23135:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
            }
            // InternalOCLinEcore.g:23136:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
            int alt229=2;
            int LA229_0 = input.LA(1);

            if ( (LA229_0==28) ) {
                alt229=1;
            }
            switch (alt229) {
                case 1 :
                    // InternalOCLinEcore.g:23136: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:23152: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:23156:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
            // InternalOCLinEcore.g:23157: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:23164: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:23168:1: ( ( 'extends' ) )
            // InternalOCLinEcore.g:23169:1: ( 'extends' )
            {
            // InternalOCLinEcore.g:23169:1: ( 'extends' )
            // InternalOCLinEcore.g:23170: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:23183: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:23187:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
            // InternalOCLinEcore.g:23188: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:23194: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:23198:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
            // InternalOCLinEcore.g:23199:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
            {
            // InternalOCLinEcore.g:23199:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
            // InternalOCLinEcore.g:23200:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
            }
            // InternalOCLinEcore.g:23201:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
            // InternalOCLinEcore.g:23201: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:23216:1: rule__TopLevelCS__OwnedImportsAssignment_2 : ( ruleImportCS ) ;
    public final void rule__TopLevelCS__OwnedImportsAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23220:1: ( ( ruleImportCS ) )
            // InternalOCLinEcore.g:23221:1: ( ruleImportCS )
            {
            // InternalOCLinEcore.g:23221:1: ( ruleImportCS )
            // InternalOCLinEcore.g:23222: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:23231:1: rule__TopLevelCS__OwnedPackagesAssignment_3 : ( rulePackageCS ) ;
    public final void rule__TopLevelCS__OwnedPackagesAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23235:1: ( ( rulePackageCS ) )
            // InternalOCLinEcore.g:23236:1: ( rulePackageCS )
            {
            // InternalOCLinEcore.g:23236:1: ( rulePackageCS )
            // InternalOCLinEcore.g:23237: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:23246:1: rule__InvariantConstraintCS__IsCallableAssignment_0 : ( ( 'callable' ) ) ;
    public final void rule__InvariantConstraintCS__IsCallableAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23250:1: ( ( ( 'callable' ) ) )
            // InternalOCLinEcore.g:23251:1: ( ( 'callable' ) )
            {
            // InternalOCLinEcore.g:23251:1: ( ( 'callable' ) )
            // InternalOCLinEcore.g:23252:1: ( 'callable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
            }
            // InternalOCLinEcore.g:23253:1: ( 'callable' )
            // InternalOCLinEcore.g:23254: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:23269:1: rule__InvariantConstraintCS__StereotypeAssignment_1 : ( ( 'invariant' ) ) ;
    public final void rule__InvariantConstraintCS__StereotypeAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23273:1: ( ( ( 'invariant' ) ) )
            // InternalOCLinEcore.g:23274:1: ( ( 'invariant' ) )
            {
            // InternalOCLinEcore.g:23274:1: ( ( 'invariant' ) )
            // InternalOCLinEcore.g:23275:1: ( 'invariant' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
            }
            // InternalOCLinEcore.g:23276:1: ( 'invariant' )
            // InternalOCLinEcore.g:23277: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:23292:1: rule__InvariantConstraintCS__NameAssignment_2_0 : ( ruleUnrestrictedName ) ;
    public final void rule__InvariantConstraintCS__NameAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23296:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:23297:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:23297:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:23298: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:23307: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:23311:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23312:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23312:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23313: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:23322: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:23326:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23327:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23327:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23328: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:23337:1: rule__PostconditionConstraintCS__StereotypeAssignment_0 : ( ( 'postcondition' ) ) ;
    public final void rule__PostconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23341:1: ( ( ( 'postcondition' ) ) )
            // InternalOCLinEcore.g:23342:1: ( ( 'postcondition' ) )
            {
            // InternalOCLinEcore.g:23342:1: ( ( 'postcondition' ) )
            // InternalOCLinEcore.g:23343:1: ( 'postcondition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
            }
            // InternalOCLinEcore.g:23344:1: ( 'postcondition' )
            // InternalOCLinEcore.g:23345: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:23360:1: rule__PostconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
    public final void rule__PostconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23364:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:23365:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:23365:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:23366: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:23375: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:23379:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23380:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23380:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23381: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:23390:1: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
    public final void rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23394:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23395:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23395:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23396: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:23405:1: rule__PreconditionConstraintCS__StereotypeAssignment_0 : ( ( 'precondition' ) ) ;
    public final void rule__PreconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23409:1: ( ( ( 'precondition' ) ) )
            // InternalOCLinEcore.g:23410:1: ( ( 'precondition' ) )
            {
            // InternalOCLinEcore.g:23410:1: ( ( 'precondition' ) )
            // InternalOCLinEcore.g:23411:1: ( 'precondition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
            }
            // InternalOCLinEcore.g:23412:1: ( 'precondition' )
            // InternalOCLinEcore.g:23413: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:23428:1: rule__PreconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
    public final void rule__PreconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23432:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:23433:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:23433:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:23434: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:23443: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:23447:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23448:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23448:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23449: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:23458:1: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
    public final void rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23462:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:23463:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:23463:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:23464: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:23473: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:23477:1: ( ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) )
            // InternalOCLinEcore.g:23478:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
            {
            // InternalOCLinEcore.g:23478:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
            // InternalOCLinEcore.g:23479:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAnnotationCSAccess().getNameAlternatives_2_0());
            }
            // InternalOCLinEcore.g:23480:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
            // InternalOCLinEcore.g:23480: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:23489:1: rule__AnnotationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
    public final void rule__AnnotationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23493:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:23494:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:23494:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:23495: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:23504: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:23508:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:23509:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:23509:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:23510: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:23519: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:23523:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:23524:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:23524:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:23525: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:23534: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:23538:1: ( ( ruleModelElementCS ) )
            // InternalOCLinEcore.g:23539:1: ( ruleModelElementCS )
            {
            // InternalOCLinEcore.g:23539:1: ( ruleModelElementCS )
            // InternalOCLinEcore.g:23540: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:23549: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:23553:1: ( ( ruleModelElementRefCS ) )
            // InternalOCLinEcore.g:23554:1: ( ruleModelElementRefCS )
            {
            // InternalOCLinEcore.g:23554:1: ( ruleModelElementRefCS )
            // InternalOCLinEcore.g:23555: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:23564: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:23568:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:23569:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:23569:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:23570:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:23571:1: ( 'static' )
            // InternalOCLinEcore.g:23572: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:23587: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:23591:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:23592:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:23592:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:23593:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:23594:1: ( 'definition' )
            // InternalOCLinEcore.g:23595: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:23610: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:23614:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:23615:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:23615:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:23616:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:23617:1: ( 'definition' )
            // InternalOCLinEcore.g:23618: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:23633: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:23637:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:23638:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:23638:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:23639:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:23640:1: ( 'static' )
            // InternalOCLinEcore.g:23641: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:23656:1: rule__AttributeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__AttributeCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23660:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:23661:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:23661:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:23662: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:23671:1: rule__AttributeCS__OwnedTypeAssignment_3_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__AttributeCS__OwnedTypeAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:23675:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:23676:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:23676:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:23677: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:23686: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:23690:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:23691:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:23691:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:23692: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:23701: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:23705:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:23706:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:23706:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:23707:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
            }
            // InternalOCLinEcore.g:23708:1: ( 'derived' )
            // InternalOCLinEcore.g:23709: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:23724: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:23728:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:23729:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:23729:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:23730:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }
            // InternalOCLinEcore.g:23731:1: ( '!derived' )
            // InternalOCLinEcore.g:23732:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
            }
            match(input,122,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:23747: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:23751:1: ( ( ( 'id' ) ) )
            // InternalOCLinEcore.g:23752:1: ( ( 'id' ) )
            {
            // InternalOCLinEcore.g:23752:1: ( ( 'id' ) )
            // InternalOCLinEcore.g:23753:1: ( 'id' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
            }
            // InternalOCLinEcore.g:23754:1: ( 'id' )
            // InternalOCLinEcore.g:23755: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:23770: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:23774:1: ( ( ( '!id' ) ) )
            // InternalOCLinEcore.g:23775:1: ( ( '!id' ) )
            {
            // InternalOCLinEcore.g:23775:1: ( ( '!id' ) )
            // InternalOCLinEcore.g:23776:1: ( '!id' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }
            // InternalOCLinEcore.g:23777:1: ( '!id' )
            // InternalOCLinEcore.g:23778:1: '!id'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
            }
            match(input,123,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:23793: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:23797:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:23798:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:23798:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:23799:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
            }
            // InternalOCLinEcore.g:23800:1: ( 'ordered' )
            // InternalOCLinEcore.g:23801: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:23816: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:23820:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:23821:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:23821:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:23822:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }
            // InternalOCLinEcore.g:23823:1: ( '!ordered' )
            // InternalOCLinEcore.g:23824:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
            }
            match(input,124,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:23839: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:23843:1: ( ( ( 'readonly' ) ) )
            // InternalOCLinEcore.g:23844:1: ( ( 'readonly' ) )
            {
            // InternalOCLinEcore.g:23844:1: ( ( 'readonly' ) )
            // InternalOCLinEcore.g:23845:1: ( 'readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
            }
            // InternalOCLinEcore.g:23846:1: ( 'readonly' )
            // InternalOCLinEcore.g:23847: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:23862: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:23866:1: ( ( ( '!readonly' ) ) )
            // InternalOCLinEcore.g:23867:1: ( ( '!readonly' ) )
            {
            // InternalOCLinEcore.g:23867:1: ( ( '!readonly' ) )
            // InternalOCLinEcore.g:23868:1: ( '!readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }
            // InternalOCLinEcore.g:23869:1: ( '!readonly' )
            // InternalOCLinEcore.g:23870:1: '!readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
            }
            match(input,125,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:23885: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:23889:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:23890:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:23890:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:23891:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
            }
            // InternalOCLinEcore.g:23892:1: ( 'transient' )
            // InternalOCLinEcore.g:23893: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:23908: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:23912:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:23913:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:23913:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:23914:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }
            // InternalOCLinEcore.g:23915:1: ( '!transient' )
            // InternalOCLinEcore.g:23916:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
            }
            match(input,126,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:23931: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:23935:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:23936:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:23936:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:23937:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
            }
            // InternalOCLinEcore.g:23938:1: ( 'unique' )
            // InternalOCLinEcore.g:23939: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:23954: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:23958:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:23959:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:23959:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:23960:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }
            // InternalOCLinEcore.g:23961:1: ( '!unique' )
            // InternalOCLinEcore.g:23962:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
            }
            match(input,127,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:23977: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:23981:1: ( ( ( 'unsettable' ) ) )
            // InternalOCLinEcore.g:23982:1: ( ( 'unsettable' ) )
            {
            // InternalOCLinEcore.g:23982:1: ( ( 'unsettable' ) )
            // InternalOCLinEcore.g:23983:1: ( 'unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
            }
            // InternalOCLinEcore.g:23984:1: ( 'unsettable' )
            // InternalOCLinEcore.g:23985: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:24000: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:24004:1: ( ( ( '!unsettable' ) ) )
            // InternalOCLinEcore.g:24005:1: ( ( '!unsettable' ) )
            {
            // InternalOCLinEcore.g:24005:1: ( ( '!unsettable' ) )
            // InternalOCLinEcore.g:24006:1: ( '!unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }
            // InternalOCLinEcore.g:24007:1: ( '!unsettable' )
            // InternalOCLinEcore.g:24008:1: '!unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
            }
            match(input,128,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:24023: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:24027:1: ( ( ( 'volatile' ) ) )
            // InternalOCLinEcore.g:24028:1: ( ( 'volatile' ) )
            {
            // InternalOCLinEcore.g:24028:1: ( ( 'volatile' ) )
            // InternalOCLinEcore.g:24029:1: ( 'volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
            }
            // InternalOCLinEcore.g:24030:1: ( 'volatile' )
            // InternalOCLinEcore.g:24031: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:24046: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:24050:1: ( ( ( '!volatile' ) ) )
            // InternalOCLinEcore.g:24051:1: ( ( '!volatile' ) )
            {
            // InternalOCLinEcore.g:24051:1: ( ( '!volatile' ) )
            // InternalOCLinEcore.g:24052:1: ( '!volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }
            // InternalOCLinEcore.g:24053:1: ( '!volatile' )
            // InternalOCLinEcore.g:24054:1: '!volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
            }
            match(input,129,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:24069: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:24073:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:24074:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:24074:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:24075: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:24084: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:24088:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24089:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24089:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24090: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:24099: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:24103:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24104:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24104:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24105: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:24114:1: rule__DataTypeCS__IsPrimitiveAssignment_0 : ( ( 'primitive' ) ) ;
    public final void rule__DataTypeCS__IsPrimitiveAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24118:1: ( ( ( 'primitive' ) ) )
            // InternalOCLinEcore.g:24119:1: ( ( 'primitive' ) )
            {
            // InternalOCLinEcore.g:24119:1: ( ( 'primitive' ) )
            // InternalOCLinEcore.g:24120:1: ( 'primitive' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
            }
            // InternalOCLinEcore.g:24121:1: ( 'primitive' )
            // InternalOCLinEcore.g:24122: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:24137:1: rule__DataTypeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__DataTypeCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24141:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24142:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24142:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24143: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:24152:1: rule__DataTypeCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
    public final void rule__DataTypeCS__OwnedSignatureAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24156:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:24157:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:24157:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:24158: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:24167: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:24171:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:24172:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:24172:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:24173: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:24182: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:24186:1: ( ( ( 'serializable' ) ) )
            // InternalOCLinEcore.g:24187:1: ( ( 'serializable' ) )
            {
            // InternalOCLinEcore.g:24187:1: ( ( 'serializable' ) )
            // InternalOCLinEcore.g:24188:1: ( 'serializable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }
            // InternalOCLinEcore.g:24189:1: ( 'serializable' )
            // InternalOCLinEcore.g:24190:1: 'serializable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
            }
            match(input,58,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:24205: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:24209:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:24210:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:24210:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:24211: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:24220: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:24224:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:24225:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:24225:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:24226: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:24235: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:24239:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
            // InternalOCLinEcore.g:24240:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
            {
            // InternalOCLinEcore.g:24240:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
            // InternalOCLinEcore.g:24241:1: ( rule__DetailCS__NameAlternatives_0_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getNameAlternatives_0_0());
            }
            // InternalOCLinEcore.g:24242:1: ( rule__DetailCS__NameAlternatives_0_0 )
            // InternalOCLinEcore.g:24242: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:24251: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:24255:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
            // InternalOCLinEcore.g:24256:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
            {
            // InternalOCLinEcore.g:24256:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
            // InternalOCLinEcore.g:24257:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getDetailCSAccess().getValuesAlternatives_2_0());
            }
            // InternalOCLinEcore.g:24258:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
            // InternalOCLinEcore.g:24258: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:24267:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
    public final void rule__DocumentationCS__ValueAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24271:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:24272:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:24272:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:24273: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:24282:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
    public final void rule__DocumentationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24286:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:24287:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:24287:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:24288: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:24297: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:24301:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:24302:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:24302:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:24303: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:24312:1: rule__EnumerationCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
    public final void rule__EnumerationCS__NameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24316:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24317:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24317:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24318: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:24327:1: rule__EnumerationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
    public final void rule__EnumerationCS__OwnedSignatureAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24331:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:24332:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:24332:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:24333: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:24342: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:24346:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:24347:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:24347:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:24348: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:24357: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:24361:1: ( ( ( 'serializable' ) ) )
            // InternalOCLinEcore.g:24362:1: ( ( 'serializable' ) )
            {
            // InternalOCLinEcore.g:24362:1: ( ( 'serializable' ) )
            // InternalOCLinEcore.g:24363:1: ( 'serializable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }
            // InternalOCLinEcore.g:24364:1: ( 'serializable' )
            // InternalOCLinEcore.g:24365:1: 'serializable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
            }
            match(input,58,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:24380: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:24384:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:24385:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:24385:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:24386: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:24395: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:24399:1: ( ( ruleEnumerationLiteralCS ) )
            // InternalOCLinEcore.g:24400:1: ( ruleEnumerationLiteralCS )
            {
            // InternalOCLinEcore.g:24400:1: ( ruleEnumerationLiteralCS )
            // InternalOCLinEcore.g:24401: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:24410: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:24414:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:24415:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:24415:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:24416: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:24425: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:24429:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24430:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24430:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24431: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:24440:1: rule__EnumerationLiteralCS__NameAssignment_0_1 : ( ruleEnumerationLiteralName ) ;
    public final void rule__EnumerationLiteralCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24444:1: ( ( ruleEnumerationLiteralName ) )
            // InternalOCLinEcore.g:24445:1: ( ruleEnumerationLiteralName )
            {
            // InternalOCLinEcore.g:24445:1: ( ruleEnumerationLiteralName )
            // InternalOCLinEcore.g:24446: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__ValueAssignment_1_1"
    // InternalOCLinEcore.g:24455:1: rule__EnumerationLiteralCS__ValueAssignment_1_1 : ( ruleSIGNED ) ;
    public final void rule__EnumerationLiteralCS__ValueAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24459:1: ( ( ruleSIGNED ) )
            // InternalOCLinEcore.g:24460:1: ( ruleSIGNED )
            {
            // InternalOCLinEcore.g:24460:1: ( ruleSIGNED )
            // InternalOCLinEcore.g:24461:1: ruleSIGNED
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleSIGNED();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24474:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:24475:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:24475:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:24476:1: ruleAnnotationElementCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_2_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleAnnotationElementCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24489:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24490:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24490:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24491: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:24500:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
    public final void rule__ImportCS__OwnedPathNameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24504:1: ( ( ruleURIPathNameCS ) )
            // InternalOCLinEcore.g:24505:1: ( ruleURIPathNameCS )
            {
            // InternalOCLinEcore.g:24505:1: ( ruleURIPathNameCS )
            // InternalOCLinEcore.g:24506: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:24515:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
    public final void rule__ImportCS__IsAllAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24519:1: ( ( ( '::*' ) ) )
            // InternalOCLinEcore.g:24520:1: ( ( '::*' ) )
            {
            // InternalOCLinEcore.g:24520:1: ( ( '::*' ) )
            // InternalOCLinEcore.g:24521:1: ( '::*' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }
            // InternalOCLinEcore.g:24522:1: ( '::*' )
            // InternalOCLinEcore.g:24523:1: '::*'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
            }
            match(input,130,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:24538:1: rule__ModelElementRefCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
    public final void rule__ModelElementRefCS__OwnedPathNameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24542:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:24543:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:24543:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:24544: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:24553: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:24557:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:24558:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:24558:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:24559:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:24560:1: ( 'static' )
            // InternalOCLinEcore.g:24561: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:24576: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:24580:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:24581:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:24581:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:24582:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:24583:1: ( 'definition' )
            // InternalOCLinEcore.g:24584: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:24599: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:24603:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:24604:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:24604:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:24605:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:24606:1: ( 'definition' )
            // InternalOCLinEcore.g:24607: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:24622: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:24626:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:24627:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:24627:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:24628:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:24629:1: ( 'static' )
            // InternalOCLinEcore.g:24630: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:24645:1: rule__OperationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
    public final void rule__OperationCS__OwnedSignatureAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24649:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:24650:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:24650:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:24651: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:24660:1: rule__OperationCS__NameAssignment_3 : ( ruleUnrestrictedName ) ;
    public final void rule__OperationCS__NameAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24664:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24665:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24665:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:24666: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:24675:1: rule__OperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
    public final void rule__OperationCS__OwnedParametersAssignment_5_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24679:1: ( ( ruleParameterCS ) )
            // InternalOCLinEcore.g:24680:1: ( ruleParameterCS )
            {
            // InternalOCLinEcore.g:24680:1: ( ruleParameterCS )
            // InternalOCLinEcore.g:24681: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:24690: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:24694:1: ( ( ruleParameterCS ) )
            // InternalOCLinEcore.g:24695:1: ( ruleParameterCS )
            {
            // InternalOCLinEcore.g:24695:1: ( ruleParameterCS )
            // InternalOCLinEcore.g:24696: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:24705:1: rule__OperationCS__OwnedTypeAssignment_7_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__OperationCS__OwnedTypeAssignment_7_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24709:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:24710:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:24710:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:24711: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:24720:1: rule__OperationCS__OwnedExceptionsAssignment_8_1 : ( ruleTypedRefCS ) ;
    public final void rule__OperationCS__OwnedExceptionsAssignment_8_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24724:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:24725:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:24725:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:24726: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:24735: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:24739:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:24740:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:24740:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:24741: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:24750: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:24754:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:24755:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:24755:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:24756:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
            }
            // InternalOCLinEcore.g:24757:1: ( 'derived' )
            // InternalOCLinEcore.g:24758: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:24773: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:24777:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:24778:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:24778:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:24779:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }
            // InternalOCLinEcore.g:24780:1: ( '!derived' )
            // InternalOCLinEcore.g:24781:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
            }
            match(input,122,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:24796: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:24800:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:24801:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:24801:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:24802:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
            }
            // InternalOCLinEcore.g:24803:1: ( 'ordered' )
            // InternalOCLinEcore.g:24804: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:24819: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:24823:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:24824:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:24824:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:24825:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }
            // InternalOCLinEcore.g:24826:1: ( '!ordered' )
            // InternalOCLinEcore.g:24827:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
            }
            match(input,124,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:24842: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:24846:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:24847:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:24847:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:24848:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
            }
            // InternalOCLinEcore.g:24849:1: ( 'transient' )
            // InternalOCLinEcore.g:24850: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:24865: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:24869:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:24870:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:24870:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:24871:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }
            // InternalOCLinEcore.g:24872:1: ( '!transient' )
            // InternalOCLinEcore.g:24873:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
            }
            match(input,126,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:24888: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:24892:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:24893:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:24893:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:24894:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
            }
            // InternalOCLinEcore.g:24895:1: ( 'unique' )
            // InternalOCLinEcore.g:24896: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:24911: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:24915:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:24916:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:24916:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:24917:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }
            // InternalOCLinEcore.g:24918:1: ( '!unique' )
            // InternalOCLinEcore.g:24919:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
            }
            match(input,127,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:24934: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:24938:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:24939:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:24939:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:24940: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:24949: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:24953:1: ( ( rulePreconditionConstraintCS ) )
            // InternalOCLinEcore.g:24954:1: ( rulePreconditionConstraintCS )
            {
            // InternalOCLinEcore.g:24954:1: ( rulePreconditionConstraintCS )
            // InternalOCLinEcore.g:24955: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:24964: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:24968:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:24969:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:24969:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:24970: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:24979: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:24983:1: ( ( rulePostconditionConstraintCS ) )
            // InternalOCLinEcore.g:24984:1: ( rulePostconditionConstraintCS )
            {
            // InternalOCLinEcore.g:24984:1: ( rulePostconditionConstraintCS )
            // InternalOCLinEcore.g:24985: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:24994:1: rule__PackageCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
    public final void rule__PackageCS__NameAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:24998:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:24999:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:24999:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25000: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:25009:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleUnrestrictedName ) ;
    public final void rule__PackageCS__NsPrefixAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25013:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25014:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25014:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25015: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:25024:1: rule__PackageCS__NsURIAssignment_3_1 : ( ruleURI ) ;
    public final void rule__PackageCS__NsURIAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25028:1: ( ( ruleURI ) )
            // InternalOCLinEcore.g:25029:1: ( ruleURI )
            {
            // InternalOCLinEcore.g:25029:1: ( ruleURI )
            // InternalOCLinEcore.g:25030: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:25039: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:25043:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25044:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25044:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25045: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:25054: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:25058:1: ( ( rulePackageCS ) )
            // InternalOCLinEcore.g:25059:1: ( rulePackageCS )
            {
            // InternalOCLinEcore.g:25059:1: ( rulePackageCS )
            // InternalOCLinEcore.g:25060: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:25069: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:25073:1: ( ( ruleClassCS ) )
            // InternalOCLinEcore.g:25074:1: ( ruleClassCS )
            {
            // InternalOCLinEcore.g:25074:1: ( ruleClassCS )
            // InternalOCLinEcore.g:25075: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:25084:1: rule__ParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__ParameterCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25088:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25089:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25089:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25090: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:25099:1: rule__ParameterCS__OwnedTypeAssignment_1_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__ParameterCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25103:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:25104:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:25104:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:25105: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:25114: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:25118:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:25119:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:25119:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:25120:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
            }
            // InternalOCLinEcore.g:25121:1: ( 'ordered' )
            // InternalOCLinEcore.g:25122: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:25137: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:25141:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:25142:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:25142:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:25143:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }
            // InternalOCLinEcore.g:25144:1: ( '!ordered' )
            // InternalOCLinEcore.g:25145:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
            }
            match(input,124,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:25160: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:25164:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:25165:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:25165:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:25166:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
            }
            // InternalOCLinEcore.g:25167:1: ( 'unique' )
            // InternalOCLinEcore.g:25168: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:25183: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:25187:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:25188:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:25188:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:25189:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }
            // InternalOCLinEcore.g:25190:1: ( '!unique' )
            // InternalOCLinEcore.g:25191:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
            }
            match(input,127,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:25206:1: rule__ParameterCS__OwnedAnnotationsAssignment_3_1 : ( ruleAnnotationElementCS ) ;
    public final void rule__ParameterCS__OwnedAnnotationsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25210:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25211:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25211:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25212: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__ReferenceCS__QualifiersAssignment_0_0_0"
    // InternalOCLinEcore.g:25221: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:25225:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:25226:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:25226:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:25227:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
            }
            // InternalOCLinEcore.g:25228:1: ( 'static' )
            // InternalOCLinEcore.g:25229: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:25244: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:25248:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:25249:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:25249:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:25250:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
            }
            // InternalOCLinEcore.g:25251:1: ( 'definition' )
            // InternalOCLinEcore.g:25252: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:25267: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:25271:1: ( ( ( 'definition' ) ) )
            // InternalOCLinEcore.g:25272:1: ( ( 'definition' ) )
            {
            // InternalOCLinEcore.g:25272:1: ( ( 'definition' ) )
            // InternalOCLinEcore.g:25273:1: ( 'definition' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
            }
            // InternalOCLinEcore.g:25274:1: ( 'definition' )
            // InternalOCLinEcore.g:25275: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:25290: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:25294:1: ( ( ( 'static' ) ) )
            // InternalOCLinEcore.g:25295:1: ( ( 'static' ) )
            {
            // InternalOCLinEcore.g:25295:1: ( ( 'static' ) )
            // InternalOCLinEcore.g:25296:1: ( 'static' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
            }
            // InternalOCLinEcore.g:25297:1: ( 'static' )
            // InternalOCLinEcore.g:25298: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:25313:1: rule__ReferenceCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__ReferenceCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25317:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25318:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25318:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25319: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:25328:1: rule__ReferenceCS__ReferredOppositeAssignment_3_1 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ReferenceCS__ReferredOppositeAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25332:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:25333:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:25333:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25334:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());
            }
            // InternalOCLinEcore.g:25335:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25336: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:25347:1: rule__ReferenceCS__OwnedTypeAssignment_4_1 : ( ruleTypedMultiplicityRefCS ) ;
    public final void rule__ReferenceCS__OwnedTypeAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25351:1: ( ( ruleTypedMultiplicityRefCS ) )
            // InternalOCLinEcore.g:25352:1: ( ruleTypedMultiplicityRefCS )
            {
            // InternalOCLinEcore.g:25352:1: ( ruleTypedMultiplicityRefCS )
            // InternalOCLinEcore.g:25353: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:25362: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:25366:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25367:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25367:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25368: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:25377: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:25381:1: ( ( ( 'composes' ) ) )
            // InternalOCLinEcore.g:25382:1: ( ( 'composes' ) )
            {
            // InternalOCLinEcore.g:25382:1: ( ( 'composes' ) )
            // InternalOCLinEcore.g:25383:1: ( 'composes' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
            }
            // InternalOCLinEcore.g:25384:1: ( 'composes' )
            // InternalOCLinEcore.g:25385: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:25400: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:25404:1: ( ( ( '!composes' ) ) )
            // InternalOCLinEcore.g:25405:1: ( ( '!composes' ) )
            {
            // InternalOCLinEcore.g:25405:1: ( ( '!composes' ) )
            // InternalOCLinEcore.g:25406:1: ( '!composes' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }
            // InternalOCLinEcore.g:25407:1: ( '!composes' )
            // InternalOCLinEcore.g:25408:1: '!composes'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
            }
            match(input,131,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:25423: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:25427:1: ( ( ( 'derived' ) ) )
            // InternalOCLinEcore.g:25428:1: ( ( 'derived' ) )
            {
            // InternalOCLinEcore.g:25428:1: ( ( 'derived' ) )
            // InternalOCLinEcore.g:25429:1: ( 'derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
            }
            // InternalOCLinEcore.g:25430:1: ( 'derived' )
            // InternalOCLinEcore.g:25431: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:25446: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:25450:1: ( ( ( '!derived' ) ) )
            // InternalOCLinEcore.g:25451:1: ( ( '!derived' ) )
            {
            // InternalOCLinEcore.g:25451:1: ( ( '!derived' ) )
            // InternalOCLinEcore.g:25452:1: ( '!derived' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }
            // InternalOCLinEcore.g:25453:1: ( '!derived' )
            // InternalOCLinEcore.g:25454:1: '!derived'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
            }
            match(input,122,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:25469: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:25473:1: ( ( ( 'ordered' ) ) )
            // InternalOCLinEcore.g:25474:1: ( ( 'ordered' ) )
            {
            // InternalOCLinEcore.g:25474:1: ( ( 'ordered' ) )
            // InternalOCLinEcore.g:25475:1: ( 'ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
            }
            // InternalOCLinEcore.g:25476:1: ( 'ordered' )
            // InternalOCLinEcore.g:25477: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:25492: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:25496:1: ( ( ( '!ordered' ) ) )
            // InternalOCLinEcore.g:25497:1: ( ( '!ordered' ) )
            {
            // InternalOCLinEcore.g:25497:1: ( ( '!ordered' ) )
            // InternalOCLinEcore.g:25498:1: ( '!ordered' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }
            // InternalOCLinEcore.g:25499:1: ( '!ordered' )
            // InternalOCLinEcore.g:25500:1: '!ordered'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
            }
            match(input,124,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:25515: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:25519:1: ( ( ( 'readonly' ) ) )
            // InternalOCLinEcore.g:25520:1: ( ( 'readonly' ) )
            {
            // InternalOCLinEcore.g:25520:1: ( ( 'readonly' ) )
            // InternalOCLinEcore.g:25521:1: ( 'readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
            }
            // InternalOCLinEcore.g:25522:1: ( 'readonly' )
            // InternalOCLinEcore.g:25523: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:25538: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:25542:1: ( ( ( '!readonly' ) ) )
            // InternalOCLinEcore.g:25543:1: ( ( '!readonly' ) )
            {
            // InternalOCLinEcore.g:25543:1: ( ( '!readonly' ) )
            // InternalOCLinEcore.g:25544:1: ( '!readonly' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }
            // InternalOCLinEcore.g:25545:1: ( '!readonly' )
            // InternalOCLinEcore.g:25546:1: '!readonly'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
            }
            match(input,125,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:25561: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:25565:1: ( ( ( 'resolve' ) ) )
            // InternalOCLinEcore.g:25566:1: ( ( 'resolve' ) )
            {
            // InternalOCLinEcore.g:25566:1: ( ( 'resolve' ) )
            // InternalOCLinEcore.g:25567:1: ( 'resolve' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
            }
            // InternalOCLinEcore.g:25568:1: ( 'resolve' )
            // InternalOCLinEcore.g:25569: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:25584: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:25588:1: ( ( ( '!resolve' ) ) )
            // InternalOCLinEcore.g:25589:1: ( ( '!resolve' ) )
            {
            // InternalOCLinEcore.g:25589:1: ( ( '!resolve' ) )
            // InternalOCLinEcore.g:25590:1: ( '!resolve' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }
            // InternalOCLinEcore.g:25591:1: ( '!resolve' )
            // InternalOCLinEcore.g:25592:1: '!resolve'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
            }
            match(input,132,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:25607: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:25611:1: ( ( ( 'transient' ) ) )
            // InternalOCLinEcore.g:25612:1: ( ( 'transient' ) )
            {
            // InternalOCLinEcore.g:25612:1: ( ( 'transient' ) )
            // InternalOCLinEcore.g:25613:1: ( 'transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
            }
            // InternalOCLinEcore.g:25614:1: ( 'transient' )
            // InternalOCLinEcore.g:25615: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:25630: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:25634:1: ( ( ( '!transient' ) ) )
            // InternalOCLinEcore.g:25635:1: ( ( '!transient' ) )
            {
            // InternalOCLinEcore.g:25635:1: ( ( '!transient' ) )
            // InternalOCLinEcore.g:25636:1: ( '!transient' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }
            // InternalOCLinEcore.g:25637:1: ( '!transient' )
            // InternalOCLinEcore.g:25638:1: '!transient'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
            }
            match(input,126,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:25653: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:25657:1: ( ( ( 'unique' ) ) )
            // InternalOCLinEcore.g:25658:1: ( ( 'unique' ) )
            {
            // InternalOCLinEcore.g:25658:1: ( ( 'unique' ) )
            // InternalOCLinEcore.g:25659:1: ( 'unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
            }
            // InternalOCLinEcore.g:25660:1: ( 'unique' )
            // InternalOCLinEcore.g:25661: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:25676: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:25680:1: ( ( ( '!unique' ) ) )
            // InternalOCLinEcore.g:25681:1: ( ( '!unique' ) )
            {
            // InternalOCLinEcore.g:25681:1: ( ( '!unique' ) )
            // InternalOCLinEcore.g:25682:1: ( '!unique' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }
            // InternalOCLinEcore.g:25683:1: ( '!unique' )
            // InternalOCLinEcore.g:25684:1: '!unique'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
            }
            match(input,127,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:25699: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:25703:1: ( ( ( 'unsettable' ) ) )
            // InternalOCLinEcore.g:25704:1: ( ( 'unsettable' ) )
            {
            // InternalOCLinEcore.g:25704:1: ( ( 'unsettable' ) )
            // InternalOCLinEcore.g:25705:1: ( 'unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
            }
            // InternalOCLinEcore.g:25706:1: ( 'unsettable' )
            // InternalOCLinEcore.g:25707: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:25722: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:25726:1: ( ( ( '!unsettable' ) ) )
            // InternalOCLinEcore.g:25727:1: ( ( '!unsettable' ) )
            {
            // InternalOCLinEcore.g:25727:1: ( ( '!unsettable' ) )
            // InternalOCLinEcore.g:25728:1: ( '!unsettable' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }
            // InternalOCLinEcore.g:25729:1: ( '!unsettable' )
            // InternalOCLinEcore.g:25730:1: '!unsettable'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
            }
            match(input,128,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:25745: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:25749:1: ( ( ( 'volatile' ) ) )
            // InternalOCLinEcore.g:25750:1: ( ( 'volatile' ) )
            {
            // InternalOCLinEcore.g:25750:1: ( ( 'volatile' ) )
            // InternalOCLinEcore.g:25751:1: ( 'volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
            }
            // InternalOCLinEcore.g:25752:1: ( 'volatile' )
            // InternalOCLinEcore.g:25753: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:25768: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:25772:1: ( ( ( '!volatile' ) ) )
            // InternalOCLinEcore.g:25773:1: ( ( '!volatile' ) )
            {
            // InternalOCLinEcore.g:25773:1: ( ( '!volatile' ) )
            // InternalOCLinEcore.g:25774:1: ( '!volatile' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }
            // InternalOCLinEcore.g:25775:1: ( '!volatile' )
            // InternalOCLinEcore.g:25776:1: '!volatile'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
            }
            match(input,129,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:25791: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:25795:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:25796:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:25796:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:25797: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:25806: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:25810:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:25811:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:25811:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25812:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_1_0());
            }
            // InternalOCLinEcore.g:25813:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25814: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:25825: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:25829:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:25830:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:25830:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25831:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_2_1_0());
            }
            // InternalOCLinEcore.g:25832:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25833: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:25844: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:25848:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:25849:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:25849:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:25850: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:25859: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:25863:1: ( ( ruleSpecificationCS ) )
            // InternalOCLinEcore.g:25864:1: ( ruleSpecificationCS )
            {
            // InternalOCLinEcore.g:25864:1: ( ruleSpecificationCS )
            // InternalOCLinEcore.g:25865: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__SpecificationCS__OwnedExpressionAssignment_0"
    // InternalOCLinEcore.g:25874:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
    public final void rule__SpecificationCS__OwnedExpressionAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25878:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:25879:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:25879:1: ( ruleExpCS )
            // InternalOCLinEcore.g:25880: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:25889:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
    public final void rule__SpecificationCS__ExprStringAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25893:1: ( ( RULE_UNQUOTED_STRING ) )
            // InternalOCLinEcore.g:25894:1: ( RULE_UNQUOTED_STRING )
            {
            // InternalOCLinEcore.g:25894:1: ( RULE_UNQUOTED_STRING )
            // InternalOCLinEcore.g:25895: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:25904:1: rule__StructuredClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
    public final void rule__StructuredClassCS__IsAbstractAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25908:1: ( ( ( 'abstract' ) ) )
            // InternalOCLinEcore.g:25909:1: ( ( 'abstract' ) )
            {
            // InternalOCLinEcore.g:25909:1: ( ( 'abstract' ) )
            // InternalOCLinEcore.g:25910:1: ( 'abstract' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
            }
            // InternalOCLinEcore.g:25911:1: ( 'abstract' )
            // InternalOCLinEcore.g:25912: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:25927:1: rule__StructuredClassCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
    public final void rule__StructuredClassCS__NameAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25931:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:25932:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:25932:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:25933: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:25942:1: rule__StructuredClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
    public final void rule__StructuredClassCS__OwnedSignatureAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25946:1: ( ( ruleTemplateSignatureCS ) )
            // InternalOCLinEcore.g:25947:1: ( ruleTemplateSignatureCS )
            {
            // InternalOCLinEcore.g:25947:1: ( ruleTemplateSignatureCS )
            // InternalOCLinEcore.g:25948: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:25957:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 : ( ruleTypedRefCS ) ;
    public final void rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:25961:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:25962:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:25962:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:25963: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:25972: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:25976:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:25977:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:25977:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:25978: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:25987: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:25991:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
            // InternalOCLinEcore.g:25992:1: ( RULE_SINGLE_QUOTED_STRING )
            {
            // InternalOCLinEcore.g:25992:1: ( RULE_SINGLE_QUOTED_STRING )
            // InternalOCLinEcore.g:25993: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:26002:1: rule__StructuredClassCS__IsInterfaceAssignment_6_1 : ( ( 'interface' ) ) ;
    public final void rule__StructuredClassCS__IsInterfaceAssignment_6_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26006:1: ( ( ( 'interface' ) ) )
            // InternalOCLinEcore.g:26007:1: ( ( 'interface' ) )
            {
            // InternalOCLinEcore.g:26007:1: ( ( 'interface' ) )
            // InternalOCLinEcore.g:26008:1: ( 'interface' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
            }
            // InternalOCLinEcore.g:26009:1: ( 'interface' )
            // InternalOCLinEcore.g:26010: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:26025: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:26029:1: ( ( ruleAnnotationElementCS ) )
            // InternalOCLinEcore.g:26030:1: ( ruleAnnotationElementCS )
            {
            // InternalOCLinEcore.g:26030:1: ( ruleAnnotationElementCS )
            // InternalOCLinEcore.g:26031: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:26040: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:26044:1: ( ( ruleOperationCS ) )
            // InternalOCLinEcore.g:26045:1: ( ruleOperationCS )
            {
            // InternalOCLinEcore.g:26045:1: ( ruleOperationCS )
            // InternalOCLinEcore.g:26046: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:26055: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:26059:1: ( ( ruleStructuralFeatureCS ) )
            // InternalOCLinEcore.g:26060:1: ( ruleStructuralFeatureCS )
            {
            // InternalOCLinEcore.g:26060:1: ( ruleStructuralFeatureCS )
            // InternalOCLinEcore.g:26061: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:26070: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:26074:1: ( ( ruleInvariantConstraintCS ) )
            // InternalOCLinEcore.g:26075:1: ( ruleInvariantConstraintCS )
            {
            // InternalOCLinEcore.g:26075:1: ( ruleInvariantConstraintCS )
            // InternalOCLinEcore.g:26076: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:26085: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:26089:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:26090:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:26090:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:26091: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:26100: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:26104:1: ( ( ruleDetailCS ) )
            // InternalOCLinEcore.g:26105:1: ( ruleDetailCS )
            {
            // InternalOCLinEcore.g:26105:1: ( ruleDetailCS )
            // InternalOCLinEcore.g:26106: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:26115:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26119:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:26120:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:26120:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:26121: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:26130:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26134:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:26135:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:26135:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:26136: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:26145: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:26149:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:26150:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:26150:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:26151: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:26160:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
    public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26164:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:26165:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:26165:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:26166: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:26175: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:26179:1: ( ( ruleTypeParameterCS ) )
            // InternalOCLinEcore.g:26180:1: ( ruleTypeParameterCS )
            {
            // InternalOCLinEcore.g:26180:1: ( ruleTypeParameterCS )
            // InternalOCLinEcore.g:26181: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:26190:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26194:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:26195:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:26195:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:26196: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:26205: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:26209:1: ( ( ruleTemplateBindingCS ) )
            // InternalOCLinEcore.g:26210:1: ( ruleTemplateBindingCS )
            {
            // InternalOCLinEcore.g:26210:1: ( ruleTemplateBindingCS )
            // InternalOCLinEcore.g:26211: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:26220: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:26224:1: ( ( ruleTemplateBindingCS ) )
            // InternalOCLinEcore.g:26225:1: ( ruleTemplateBindingCS )
            {
            // InternalOCLinEcore.g:26225:1: ( ruleTemplateBindingCS )
            // InternalOCLinEcore.g:26226: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:26236:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
    public final void rule__URIPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26240:1: ( ( ruleURIFirstPathElementCS ) )
            // InternalOCLinEcore.g:26241:1: ( ruleURIFirstPathElementCS )
            {
            // InternalOCLinEcore.g:26241:1: ( ruleURIFirstPathElementCS )
            // InternalOCLinEcore.g:26242: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:26251:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
    public final void rule__URIPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26255:1: ( ( ruleNextPathElementCS ) )
            // InternalOCLinEcore.g:26256:1: ( ruleNextPathElementCS )
            {
            // InternalOCLinEcore.g:26256:1: ( ruleNextPathElementCS )
            // InternalOCLinEcore.g:26257: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:26266:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26270:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:26271:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:26271:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26272:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
            }
            // InternalOCLinEcore.g:26273:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26274: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:26285:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
    public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26289:1: ( ( ( ruleURI ) ) )
            // InternalOCLinEcore.g:26290:1: ( ( ruleURI ) )
            {
            // InternalOCLinEcore.g:26290:1: ( ( ruleURI ) )
            // InternalOCLinEcore.g:26291:1: ( ruleURI )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
            }
            // InternalOCLinEcore.g:26292:1: ( ruleURI )
            // InternalOCLinEcore.g:26293: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:26304:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
    public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26308:1: ( ( rulePrimitiveTypeIdentifier ) )
            // InternalOCLinEcore.g:26309:1: ( rulePrimitiveTypeIdentifier )
            {
            // InternalOCLinEcore.g:26309:1: ( rulePrimitiveTypeIdentifier )
            // InternalOCLinEcore.g:26310: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:26319:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
    public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26323:1: ( ( ruleCollectionTypeIdentifier ) )
            // InternalOCLinEcore.g:26324:1: ( ruleCollectionTypeIdentifier )
            {
            // InternalOCLinEcore.g:26324:1: ( ruleCollectionTypeIdentifier )
            // InternalOCLinEcore.g:26325: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:26334:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26338:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26339:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26339:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26340:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpCSParserRuleCall_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__MapTypeCS__NameAssignment_0"
    // InternalOCLinEcore.g:26349:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
    public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26353:1: ( ( ( 'Map' ) ) )
            // InternalOCLinEcore.g:26354:1: ( ( 'Map' ) )
            {
            // InternalOCLinEcore.g:26354:1: ( ( 'Map' ) )
            // InternalOCLinEcore.g:26355:1: ( 'Map' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }
            // InternalOCLinEcore.g:26356:1: ( 'Map' )
            // InternalOCLinEcore.g:26357:1: 'Map'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
            }
            match(input,79,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:26372:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26376:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26377:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26377:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26378: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:26387:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
    public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26391:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26392:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26392:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26393: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:26402:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
    public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26406:1: ( ( ( 'Tuple' ) ) )
            // InternalOCLinEcore.g:26407:1: ( ( 'Tuple' ) )
            {
            // InternalOCLinEcore.g:26407:1: ( ( 'Tuple' ) )
            // InternalOCLinEcore.g:26408:1: ( 'Tuple' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }
            // InternalOCLinEcore.g:26409:1: ( 'Tuple' )
            // InternalOCLinEcore.g:26410:1: 'Tuple'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
            }
            match(input,80,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:26425: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:26429:1: ( ( ruleTuplePartCS ) )
            // InternalOCLinEcore.g:26430:1: ( ruleTuplePartCS )
            {
            // InternalOCLinEcore.g:26430:1: ( ruleTuplePartCS )
            // InternalOCLinEcore.g:26431: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:26440: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:26444:1: ( ( ruleTuplePartCS ) )
            // InternalOCLinEcore.g:26445:1: ( ruleTuplePartCS )
            {
            // InternalOCLinEcore.g:26445:1: ( ruleTuplePartCS )
            // InternalOCLinEcore.g:26446: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:26455:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26459:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26460:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26460:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26461: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:26470:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
    public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26474:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26475:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26475:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26476: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:26485:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
    public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26489:1: ( ( ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:26490:1: ( ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:26490:1: ( ruleCollectionTypeCS )
            // InternalOCLinEcore.g:26491: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:26500:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
    public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26504:1: ( ( ruleCollectionLiteralPartCS ) )
            // InternalOCLinEcore.g:26505:1: ( ruleCollectionLiteralPartCS )
            {
            // InternalOCLinEcore.g:26505:1: ( ruleCollectionLiteralPartCS )
            // InternalOCLinEcore.g:26506: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:26515: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:26519:1: ( ( ruleCollectionLiteralPartCS ) )
            // InternalOCLinEcore.g:26520:1: ( ruleCollectionLiteralPartCS )
            {
            // InternalOCLinEcore.g:26520:1: ( ruleCollectionLiteralPartCS )
            // InternalOCLinEcore.g:26521: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:26530:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
    public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26534:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26535:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26535:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26536: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:26545: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:26549:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26550:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26550:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26551: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:26560:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
    public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26564:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:26565:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:26565:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:26566: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:26575:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
    public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26579:1: ( ( ruleCollectionTypeCS ) )
            // InternalOCLinEcore.g:26580:1: ( ruleCollectionTypeCS )
            {
            // InternalOCLinEcore.g:26580:1: ( ruleCollectionTypeCS )
            // InternalOCLinEcore.g:26581: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:26590:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
    public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26594:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:26595:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:26595:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:26596: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:26605: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:26609:1: ( ( rulePatternExpCS ) )
            // InternalOCLinEcore.g:26610:1: ( rulePatternExpCS )
            {
            // InternalOCLinEcore.g:26610:1: ( rulePatternExpCS )
            // InternalOCLinEcore.g:26611: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:26620: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:26624:1: ( ( ruleIdentifier ) )
            // InternalOCLinEcore.g:26625:1: ( ruleIdentifier )
            {
            // InternalOCLinEcore.g:26625:1: ( ruleIdentifier )
            // InternalOCLinEcore.g:26626: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"
    // InternalOCLinEcore.g:26635:1: rule__ShadowPartCS__ReferredPropertyAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__ShadowPartCS__ReferredPropertyAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26639:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:26640:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:26640:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26641:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0());
            }
            // InternalOCLinEcore.g:26642:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26643:1: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_1());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_2"
    // InternalOCLinEcore.g:26654:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 ) ) ;
    public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26658:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 ) ) )
            // InternalOCLinEcore.g:26659:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 ) )
            {
            // InternalOCLinEcore.g:26659:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 ) )
            // InternalOCLinEcore.g:26660:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_2_0());
            }
            // InternalOCLinEcore.g:26661:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 )
            // InternalOCLinEcore.g:26661:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0
            {
            pushFollow(FollowSets000.FOLLOW_2);
            rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0();

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

            }

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26674:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26675:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26675:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26676: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:26685:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
    public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26689:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26690:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26690:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26691: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:26700:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
    public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26704:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26705:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26705:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26706: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:26715:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
    public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26719:1: ( ( ruleMapTypeCS ) )
            // InternalOCLinEcore.g:26720:1: ( ruleMapTypeCS )
            {
            // InternalOCLinEcore.g:26720:1: ( ruleMapTypeCS )
            // InternalOCLinEcore.g:26721: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:26730:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
    public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26734:1: ( ( ruleMapLiteralPartCS ) )
            // InternalOCLinEcore.g:26735:1: ( ruleMapLiteralPartCS )
            {
            // InternalOCLinEcore.g:26735:1: ( ruleMapLiteralPartCS )
            // InternalOCLinEcore.g:26736: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:26745: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:26749:1: ( ( ruleMapLiteralPartCS ) )
            // InternalOCLinEcore.g:26750:1: ( ruleMapLiteralPartCS )
            {
            // InternalOCLinEcore.g:26750:1: ( ruleMapLiteralPartCS )
            // InternalOCLinEcore.g:26751: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:26760:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
    public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26764:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26765:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26765:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26766: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:26775:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
    public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26779:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26780:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26780:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26781: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:26790:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
    public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26794:1: ( ( ruleTupleLiteralPartCS ) )
            // InternalOCLinEcore.g:26795:1: ( ruleTupleLiteralPartCS )
            {
            // InternalOCLinEcore.g:26795:1: ( ruleTupleLiteralPartCS )
            // InternalOCLinEcore.g:26796: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:26805:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
    public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26809:1: ( ( ruleTupleLiteralPartCS ) )
            // InternalOCLinEcore.g:26810:1: ( ruleTupleLiteralPartCS )
            {
            // InternalOCLinEcore.g:26810:1: ( ruleTupleLiteralPartCS )
            // InternalOCLinEcore.g:26811: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:26820:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26824:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:26825:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:26825:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:26826: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:26835:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
    public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26839:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:26840:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:26840:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:26841: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:26850:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26854:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:26855:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:26855:1: ( ruleExpCS )
            // InternalOCLinEcore.g:26856: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:26865:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
    public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26869:1: ( ( ruleNUMBER_LITERAL ) )
            // InternalOCLinEcore.g:26870:1: ( ruleNUMBER_LITERAL )
            {
            // InternalOCLinEcore.g:26870:1: ( ruleNUMBER_LITERAL )
            // InternalOCLinEcore.g:26871: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:26880:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
    public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26884:1: ( ( ruleStringLiteral ) )
            // InternalOCLinEcore.g:26885:1: ( ruleStringLiteral )
            {
            // InternalOCLinEcore.g:26885:1: ( ruleStringLiteral )
            // InternalOCLinEcore.g:26886: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:26895:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
    public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26899:1: ( ( ( 'true' ) ) )
            // InternalOCLinEcore.g:26900:1: ( ( 'true' ) )
            {
            // InternalOCLinEcore.g:26900:1: ( ( 'true' ) )
            // InternalOCLinEcore.g:26901:1: ( 'true' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }
            // InternalOCLinEcore.g:26902:1: ( 'true' )
            // InternalOCLinEcore.g:26903:1: 'true'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
            }
            match(input,133,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:26918:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
    public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26922:1: ( ( ( 'false' ) ) )
            // InternalOCLinEcore.g:26923:1: ( ( 'false' ) )
            {
            // InternalOCLinEcore.g:26923:1: ( ( 'false' ) )
            // InternalOCLinEcore.g:26924:1: ( 'false' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }
            // InternalOCLinEcore.g:26925:1: ( 'false' )
            // InternalOCLinEcore.g:26926:1: 'false'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
            }
            match(input,134,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:26941:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26945:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:26946:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:26946:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:26947: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:26956:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
    public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26960:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
            // InternalOCLinEcore.g:26961:1: ( ruleTypeLiteralWithMultiplicityCS )
            {
            // InternalOCLinEcore.g:26961:1: ( ruleTypeLiteralWithMultiplicityCS )
            // InternalOCLinEcore.g:26962: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:26971:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26975:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:26976:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:26976:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:26977: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:26986:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
    public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:26990:1: ( ( ruleCurlyBracketedClauseCS ) )
            // InternalOCLinEcore.g:26991:1: ( ruleCurlyBracketedClauseCS )
            {
            // InternalOCLinEcore.g:26991:1: ( ruleCurlyBracketedClauseCS )
            // InternalOCLinEcore.g:26992: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:27001: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:27005:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27006:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27006:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27007: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:27016:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
    public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27020:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:27021:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:27021:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:27022: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:27031: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:27035:1: ( ( ruleBinaryOperatorName ) )
            // InternalOCLinEcore.g:27036:1: ( ruleBinaryOperatorName )
            {
            // InternalOCLinEcore.g:27036:1: ( ruleBinaryOperatorName )
            // InternalOCLinEcore.g:27037: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:27046: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:27050:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27051:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27051:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27052: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:27061:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
    public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27065:1: ( ( ruleUnaryOperatorName ) )
            // InternalOCLinEcore.g:27066:1: ( ruleUnaryOperatorName )
            {
            // InternalOCLinEcore.g:27066:1: ( ruleUnaryOperatorName )
            // InternalOCLinEcore.g:27067: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:27076:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
    public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27080:1: ( ( rulePrefixedLetExpCS ) )
            // InternalOCLinEcore.g:27081:1: ( rulePrefixedLetExpCS )
            {
            // InternalOCLinEcore.g:27081:1: ( rulePrefixedLetExpCS )
            // InternalOCLinEcore.g:27082: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:27091:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
    public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27095:1: ( ( ruleUnaryOperatorName ) )
            // InternalOCLinEcore.g:27096:1: ( ruleUnaryOperatorName )
            {
            // InternalOCLinEcore.g:27096:1: ( ruleUnaryOperatorName )
            // InternalOCLinEcore.g:27097: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:27106:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
    public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27110:1: ( ( rulePrefixedPrimaryExpCS ) )
            // InternalOCLinEcore.g:27111:1: ( rulePrefixedPrimaryExpCS )
            {
            // InternalOCLinEcore.g:27111:1: ( rulePrefixedPrimaryExpCS )
            // InternalOCLinEcore.g:27112: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:27121:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
    public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27125:1: ( ( rulePathNameCS ) )
            // InternalOCLinEcore.g:27126:1: ( rulePathNameCS )
            {
            // InternalOCLinEcore.g:27126:1: ( rulePathNameCS )
            // InternalOCLinEcore.g:27127: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:27136:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27140:1: ( ( ruleSquareBracketedClauseCS ) )
            // InternalOCLinEcore.g:27141:1: ( ruleSquareBracketedClauseCS )
            {
            // InternalOCLinEcore.g:27141:1: ( ruleSquareBracketedClauseCS )
            // InternalOCLinEcore.g:27142: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:27151:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27155:1: ( ( ruleRoundBracketedClauseCS ) )
            // InternalOCLinEcore.g:27156:1: ( ruleRoundBracketedClauseCS )
            {
            // InternalOCLinEcore.g:27156:1: ( ruleRoundBracketedClauseCS )
            // InternalOCLinEcore.g:27157: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:27166:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
    public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27170:1: ( ( ruleCurlyBracketedClauseCS ) )
            // InternalOCLinEcore.g:27171:1: ( ruleCurlyBracketedClauseCS )
            {
            // InternalOCLinEcore.g:27171:1: ( ruleCurlyBracketedClauseCS )
            // InternalOCLinEcore.g:27172: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:27181:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
    public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27185:1: ( ( ( '@' ) ) )
            // InternalOCLinEcore.g:27186:1: ( ( '@' ) )
            {
            // InternalOCLinEcore.g:27186:1: ( ( '@' ) )
            // InternalOCLinEcore.g:27187:1: ( '@' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }
            // InternalOCLinEcore.g:27188:1: ( '@' )
            // InternalOCLinEcore.g:27189:1: '@'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
            }
            match(input,135,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_0"
    // InternalOCLinEcore.g:27204:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0 : ( ruleShadowPartCS ) ;
    public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27208:1: ( ( ruleShadowPartCS ) )
            // InternalOCLinEcore.g:27209:1: ( ruleShadowPartCS )
            {
            // InternalOCLinEcore.g:27209:1: ( ruleShadowPartCS )
            // InternalOCLinEcore.g:27210:1: ruleShadowPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleShadowPartCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27223:1: ( ( ruleShadowPartCS ) )
            // InternalOCLinEcore.g:27224:1: ( ruleShadowPartCS )
            {
            // InternalOCLinEcore.g:27224:1: ( ruleShadowPartCS )
            // InternalOCLinEcore.g:27225:1: ruleShadowPartCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleShadowPartCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__CurlyBracketedClauseCS__ValueAssignment_2_1"
    // InternalOCLinEcore.g:27234:1: rule__CurlyBracketedClauseCS__ValueAssignment_2_1 : ( ruleStringLiteral ) ;
    public final void rule__CurlyBracketedClauseCS__ValueAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27238:1: ( ( ruleStringLiteral ) )
            // InternalOCLinEcore.g:27239:1: ( ruleStringLiteral )
            {
            // InternalOCLinEcore.g:27239:1: ( ruleStringLiteral )
            // InternalOCLinEcore.g:27240:1: ruleStringLiteral
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getCurlyBracketedClauseCSAccess().getValueStringLiteralParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleStringLiteral();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27253:1: ( ( ruleNavigatingArgCS ) )
            // InternalOCLinEcore.g:27254:1: ( ruleNavigatingArgCS )
            {
            // InternalOCLinEcore.g:27254:1: ( ruleNavigatingArgCS )
            // InternalOCLinEcore.g:27255: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:27264:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ruleNavigatingCommaArgCS ) ;
    public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27268:1: ( ( ruleNavigatingCommaArgCS ) )
            // InternalOCLinEcore.g:27269:1: ( ruleNavigatingCommaArgCS )
            {
            // InternalOCLinEcore.g:27269:1: ( ruleNavigatingCommaArgCS )
            // InternalOCLinEcore.g:27270:1: ruleNavigatingCommaArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingCommaArgCS();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_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__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0"
    // InternalOCLinEcore.g:27279:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0 : ( ruleNavigatingSemiArgCS ) ;
    public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_2_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27283:1: ( ( ruleNavigatingSemiArgCS ) )
            // InternalOCLinEcore.g:27284:1: ( ruleNavigatingSemiArgCS )
            {
            // InternalOCLinEcore.g:27284:1: ( ruleNavigatingSemiArgCS )
            // InternalOCLinEcore.g:27285:1: ruleNavigatingSemiArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_2_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingSemiArgCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27298:1: ( ( ruleNavigatingCommaArgCS ) )
            // InternalOCLinEcore.g:27299:1: ( ruleNavigatingCommaArgCS )
            {
            // InternalOCLinEcore.g:27299:1: ( ruleNavigatingCommaArgCS )
            // InternalOCLinEcore.g:27300:1: ruleNavigatingCommaArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_2_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingCommaArgCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27313:1: ( ( ruleNavigatingBarArgCS ) )
            // InternalOCLinEcore.g:27314:1: ( ruleNavigatingBarArgCS )
            {
            // InternalOCLinEcore.g:27314:1: ( ruleNavigatingBarArgCS )
            // InternalOCLinEcore.g:27315:1: ruleNavigatingBarArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_3_0_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingBarArgCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27328:1: ( ( ruleNavigatingCommaArgCS ) )
            // InternalOCLinEcore.g:27329:1: ( ruleNavigatingCommaArgCS )
            {
            // InternalOCLinEcore.g:27329:1: ( ruleNavigatingCommaArgCS )
            // InternalOCLinEcore.g:27330:1: ruleNavigatingCommaArgCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_3_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleNavigatingCommaArgCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27343:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27344:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27344:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27345: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:27354:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
    public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27358:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27359:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27359:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27360: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:27369:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27373:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:27374:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:27374:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:27375: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__OwnedTypeAssignment_0_1_0_1"
    // InternalOCLinEcore.g:27384:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27388:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27389:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27389:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27390:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
    // InternalOCLinEcore.g:27399: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:27403:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27404:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27404:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27405: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__OwnedInitExpressionAssignment_0_1_1_1"
    // InternalOCLinEcore.g:27414:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27418:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27419:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27419:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27420:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


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

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27433:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27434:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27434:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27435: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:27444:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
    public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27448:1: ( ( ( '|' ) ) )
            // InternalOCLinEcore.g:27449:1: ( ( '|' ) )
            {
            // InternalOCLinEcore.g:27449:1: ( ( '|' ) )
            // InternalOCLinEcore.g:27450:1: ( '|' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }
            // InternalOCLinEcore.g:27451:1: ( '|' )
            // InternalOCLinEcore.g:27452:1: '|'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
            }
            match(input,136,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:27467:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27471:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:27472:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:27472:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:27473: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:27482:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27486:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27487:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27487:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27488: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:27497: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:27501:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27502:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27502:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27503: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:27512:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
    public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27516:1: ( ( ( ',' ) ) )
            // InternalOCLinEcore.g:27517:1: ( ( ',' ) )
            {
            // InternalOCLinEcore.g:27517:1: ( ( ',' ) )
            // InternalOCLinEcore.g:27518:1: ( ',' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }
            // InternalOCLinEcore.g:27519:1: ( ',' )
            // InternalOCLinEcore.g:27520:1: ','
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
            }
            match(input,99,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:27535:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27539:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:27540:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:27540:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:27541: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__OwnedTypeAssignment_2_0_1"
    // InternalOCLinEcore.g:27550:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_0_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27554:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27555:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27555:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27556:1: ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleTypeExpCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
    // InternalOCLinEcore.g:27565: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:27569:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27570:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27570:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27571: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__OwnedInitExpressionAssignment_2_1_1"
    // InternalOCLinEcore.g:27580:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1 : ( ruleExpCS ) ;
    public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27584:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27585:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27585:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27586:1: ruleExpCS
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_1_0());
            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleExpCS();

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

            }


            }

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

            	restoreStackSize(stackSize);

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


    // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
    // InternalOCLinEcore.g:27595:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
    public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27599:1: ( ( ( ';' ) ) )
            // InternalOCLinEcore.g:27600:1: ( ( ';' ) )
            {
            // InternalOCLinEcore.g:27600:1: ( ( ';' ) )
            // InternalOCLinEcore.g:27601:1: ( ';' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
            }
            // InternalOCLinEcore.g:27602:1: ( ';' )
            // InternalOCLinEcore.g:27603: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:27618:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
    public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27622:1: ( ( ruleNavigatingArgExpCS ) )
            // InternalOCLinEcore.g:27623:1: ( ruleNavigatingArgExpCS )
            {
            // InternalOCLinEcore.g:27623:1: ( ruleNavigatingArgExpCS )
            // InternalOCLinEcore.g:27624: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:27633:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27637:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27638:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27638:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27639: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:27648: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:27652:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27653:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27653:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27654: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__IfExpCS__OwnedConditionAssignment_1"
    // InternalOCLinEcore.g:27663: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:27667:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
            // InternalOCLinEcore.g:27668:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
            {
            // InternalOCLinEcore.g:27668:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
            // InternalOCLinEcore.g:27669:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
            }
            // InternalOCLinEcore.g:27670:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
            // InternalOCLinEcore.g:27670: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:27679:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27683:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27684:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27684:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27685: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:27694:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
    public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27698:1: ( ( ruleElseIfThenExpCS ) )
            // InternalOCLinEcore.g:27699:1: ( ruleElseIfThenExpCS )
            {
            // InternalOCLinEcore.g:27699:1: ( ruleElseIfThenExpCS )
            // InternalOCLinEcore.g:27700: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:27709:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
    public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27713:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27714:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27714:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27715: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:27724:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
    public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27728:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27729:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27729:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27730: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:27739:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
    public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27743:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27744:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27744:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27745: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:27754:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
    public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27758:1: ( ( ruleLetVariableCS ) )
            // InternalOCLinEcore.g:27759:1: ( ruleLetVariableCS )
            {
            // InternalOCLinEcore.g:27759:1: ( ruleLetVariableCS )
            // InternalOCLinEcore.g:27760: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:27769:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
    public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27773:1: ( ( ruleLetVariableCS ) )
            // InternalOCLinEcore.g:27774:1: ( ruleLetVariableCS )
            {
            // InternalOCLinEcore.g:27774:1: ( ruleLetVariableCS )
            // InternalOCLinEcore.g:27775: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:27784:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
    public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27788:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27789:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27789:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27790: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:27799:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27803:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27804:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:27804:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27805: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:27814:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
    public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27818:1: ( ( ruleRoundBracketedClauseCS ) )
            // InternalOCLinEcore.g:27819:1: ( ruleRoundBracketedClauseCS )
            {
            // InternalOCLinEcore.g:27819:1: ( ruleRoundBracketedClauseCS )
            // InternalOCLinEcore.g:27820: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:27829:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
    public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27833:1: ( ( ruleTypeExpCS ) )
            // InternalOCLinEcore.g:27834:1: ( ruleTypeExpCS )
            {
            // InternalOCLinEcore.g:27834:1: ( ruleTypeExpCS )
            // InternalOCLinEcore.g:27835: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:27844:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
    public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27848:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27849:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27849:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27850: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:27859:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
    public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27863:1: ( ( ruleExpCS ) )
            // InternalOCLinEcore.g:27864:1: ( ruleExpCS )
            {
            // InternalOCLinEcore.g:27864:1: ( ruleExpCS )
            // InternalOCLinEcore.g:27865: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:27874:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
    public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27878:1: ( ( ruleLOWER ) )
            // InternalOCLinEcore.g:27879:1: ( ruleLOWER )
            {
            // InternalOCLinEcore.g:27879:1: ( ruleLOWER )
            // InternalOCLinEcore.g:27880: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:27889:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
    public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27893:1: ( ( ruleUPPER ) )
            // InternalOCLinEcore.g:27894:1: ( ruleUPPER )
            {
            // InternalOCLinEcore.g:27894:1: ( ruleUPPER )
            // InternalOCLinEcore.g:27895: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:27904:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
    public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27908:1: ( ( ( '|1' ) ) )
            // InternalOCLinEcore.g:27909:1: ( ( '|1' ) )
            {
            // InternalOCLinEcore.g:27909:1: ( ( '|1' ) )
            // InternalOCLinEcore.g:27910:1: ( '|1' )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }
            // InternalOCLinEcore.g:27911:1: ( '|1' )
            // InternalOCLinEcore.g:27912:1: '|1'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
            }
            match(input,137,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:27927:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
    public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27931:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
            // InternalOCLinEcore.g:27932:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
            {
            // InternalOCLinEcore.g:27932:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
            // InternalOCLinEcore.g:27933:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
            }
            // InternalOCLinEcore.g:27934:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
            // InternalOCLinEcore.g:27934: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:27943:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
    public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27947:1: ( ( ruleFirstPathElementCS ) )
            // InternalOCLinEcore.g:27948:1: ( ruleFirstPathElementCS )
            {
            // InternalOCLinEcore.g:27948:1: ( ruleFirstPathElementCS )
            // InternalOCLinEcore.g:27949: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:27958:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
    public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27962:1: ( ( ruleNextPathElementCS ) )
            // InternalOCLinEcore.g:27963:1: ( ruleNextPathElementCS )
            {
            // InternalOCLinEcore.g:27963:1: ( ruleNextPathElementCS )
            // InternalOCLinEcore.g:27964: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:27973:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
    public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27977:1: ( ( ( ruleUnrestrictedName ) ) )
            // InternalOCLinEcore.g:27978:1: ( ( ruleUnrestrictedName ) )
            {
            // InternalOCLinEcore.g:27978:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:27979:1: ( ruleUnrestrictedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }
            // InternalOCLinEcore.g:27980:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:27981: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:27992:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
    public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:27996:1: ( ( ( ruleUnreservedName ) ) )
            // InternalOCLinEcore.g:27997:1: ( ( ruleUnreservedName ) )
            {
            // InternalOCLinEcore.g:27997:1: ( ( ruleUnreservedName ) )
            // InternalOCLinEcore.g:27998:1: ( ruleUnreservedName )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
            }
            // InternalOCLinEcore.g:27999:1: ( ruleUnreservedName )
            // InternalOCLinEcore.g:28000: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:28011:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
    public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28015:1: ( ( ruleTemplateParameterSubstitutionCS ) )
            // InternalOCLinEcore.g:28016:1: ( ruleTemplateParameterSubstitutionCS )
            {
            // InternalOCLinEcore.g:28016:1: ( ruleTemplateParameterSubstitutionCS )
            // InternalOCLinEcore.g:28017: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:28026:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
    public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28030:1: ( ( ruleTemplateParameterSubstitutionCS ) )
            // InternalOCLinEcore.g:28031:1: ( ruleTemplateParameterSubstitutionCS )
            {
            // InternalOCLinEcore.g:28031:1: ( ruleTemplateParameterSubstitutionCS )
            // InternalOCLinEcore.g:28032: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:28041:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
    public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28045:1: ( ( ruleMultiplicityCS ) )
            // InternalOCLinEcore.g:28046:1: ( ruleMultiplicityCS )
            {
            // InternalOCLinEcore.g:28046:1: ( ruleMultiplicityCS )
            // InternalOCLinEcore.g:28047: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:28056:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
    public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28060:1: ( ( ruleTypeRefCS ) )
            // InternalOCLinEcore.g:28061:1: ( ruleTypeRefCS )
            {
            // InternalOCLinEcore.g:28061:1: ( ruleTypeRefCS )
            // InternalOCLinEcore.g:28062: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:28071:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
    public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28075:1: ( ( ruleUnrestrictedName ) )
            // InternalOCLinEcore.g:28076:1: ( ruleUnrestrictedName )
            {
            // InternalOCLinEcore.g:28076:1: ( ruleUnrestrictedName )
            // InternalOCLinEcore.g:28077: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:28086:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
    public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28090:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:28091:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:28091:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:28092: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:28101: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:28105:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:28106:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:28106:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:28107: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:28116:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
    public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {

        		int stackSize = keepStackSize();

        try {
            // InternalOCLinEcore.g:28120:1: ( ( ruleTypedRefCS ) )
            // InternalOCLinEcore.g:28121:1: ( ruleTypedRefCS )
            {
            // InternalOCLinEcore.g:28121:1: ( ruleTypedRefCS )
            // InternalOCLinEcore.g:28122: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 synpred183_InternalOCLinEcore
    public final void synpred183_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5304:6: ( ( ruleTypeLiteralCS ) )
        // InternalOCLinEcore.g:5304:6: ( ruleTypeLiteralCS )
        {
        // InternalOCLinEcore.g:5304:6: ( ruleTypeLiteralCS )
        // InternalOCLinEcore.g:5305:1: ruleTypeLiteralCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getTypeExpCSAccess().getTypeLiteralCSParserRuleCall_0_1());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTypeLiteralCS();

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

        }


        }
    }
    // $ANTLR end synpred183_InternalOCLinEcore

    // $ANTLR start synpred184_InternalOCLinEcore
    public final void synpred184_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5326:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
        // InternalOCLinEcore.g:5326:1: ( ( rule__ExpCS__Group_0__0 ) )
        {
        // InternalOCLinEcore.g:5326:1: ( ( rule__ExpCS__Group_0__0 ) )
        // InternalOCLinEcore.g:5327:1: ( rule__ExpCS__Group_0__0 )
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getExpCSAccess().getGroup_0());
        }
        // InternalOCLinEcore.g:5328:1: ( rule__ExpCS__Group_0__0 )
        // InternalOCLinEcore.g:5328:2: rule__ExpCS__Group_0__0
        {
        pushFollow(FollowSets000.FOLLOW_2);
        rule__ExpCS__Group_0__0();

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

        }


        }


        }
    }
    // $ANTLR end synpred184_InternalOCLinEcore

    // $ANTLR start synpred191_InternalOCLinEcore
    public final void synpred191_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5416:6: ( ( ruleTupleLiteralExpCS ) )
        // InternalOCLinEcore.g:5416:6: ( ruleTupleLiteralExpCS )
        {
        // InternalOCLinEcore.g:5416:6: ( ruleTupleLiteralExpCS )
        // InternalOCLinEcore.g:5417:1: ruleTupleLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTupleLiteralExpCS();

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

        }


        }
    }
    // $ANTLR end synpred191_InternalOCLinEcore

    // $ANTLR start synpred192_InternalOCLinEcore
    public final void synpred192_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5422:6: ( ( ruleMapLiteralExpCS ) )
        // InternalOCLinEcore.g:5422:6: ( ruleMapLiteralExpCS )
        {
        // InternalOCLinEcore.g:5422:6: ( ruleMapLiteralExpCS )
        // InternalOCLinEcore.g:5423:1: ruleMapLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleMapLiteralExpCS();

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

        }


        }
    }
    // $ANTLR end synpred192_InternalOCLinEcore

    // $ANTLR start synpred193_InternalOCLinEcore
    public final void synpred193_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5428:6: ( ( ruleCollectionLiteralExpCS ) )
        // InternalOCLinEcore.g:5428:6: ( ruleCollectionLiteralExpCS )
        {
        // InternalOCLinEcore.g:5428:6: ( ruleCollectionLiteralExpCS )
        // InternalOCLinEcore.g:5429:1: ruleCollectionLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleCollectionLiteralExpCS();

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

        }


        }
    }
    // $ANTLR end synpred193_InternalOCLinEcore

    // $ANTLR start synpred195_InternalOCLinEcore
    public final void synpred195_InternalOCLinEcore_fragment() throws RecognitionException {
        // InternalOCLinEcore.g:5440:6: ( ( ruleTypeLiteralExpCS ) )
        // InternalOCLinEcore.g:5440:6: ( ruleTypeLiteralExpCS )
        {
        // InternalOCLinEcore.g:5440:6: ( ruleTypeLiteralExpCS )
        // InternalOCLinEcore.g:5441:1: ruleTypeLiteralExpCS
        {
        if ( state.backtracking==0 ) {
           before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
        }
        pushFollow(FollowSets000.FOLLOW_2);
        ruleTypeLiteralExpCS();

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

        }


        }
    }
    // $ANTLR end synpred195_InternalOCLinEcore

    // Delegated rules

    public final boolean synpred183_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred183_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 synpred184_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred184_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 synpred191_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred191_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 synpred193_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred193_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 synpred192_InternalOCLinEcore() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred192_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 DFA53 dfa53 = new DFA53(this);
    protected DFA54 dfa54 = new DFA54(this);
    protected DFA58 dfa58 = new DFA58(this);
    protected DFA59 dfa59 = new DFA59(this);
    protected DFA62 dfa62 = new DFA62(this);
    protected DFA68 dfa68 = new DFA68(this);
    protected DFA123 dfa123 = new DFA123(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\144\1\uffff\6\144\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\20\uffff\1\6\36\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\6\15\11\uffff\1\6\36\uffff\1\6",
            "\1\15\34\uffff\1\6\20\uffff\1\6\36\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\6\15\11\uffff\1\6\36\uffff\1\6",
            "\2\15\10\uffff\43\15\1\6\1\uffff\6\15\11\uffff\1\6\36\uffff\1\6",
            "",
            "\2\16\10\uffff\43\16\1\6\1\uffff\6\16\11\uffff\1\6\36\uffff\1\6",
            "\1\16\21\uffff\1\20\5\uffff\1\16\3\uffff\1\17\5\uffff\1\6\20\uffff\1\6\36\uffff\1\6",
            "\2\20\10\uffff\43\20\1\6\1\uffff\6\20\6\uffff\1\20\2\uffff\1\6\32\uffff\1\20\3\uffff\1\6",
            "\2\21\10\uffff\43\21\1\6\1\uffff\6\21\11\uffff\1\6\36\uffff\1\6",
            "\2\16\10\uffff\43\16\1\6\1\uffff\6\16\11\uffff\1\6\36\uffff\1\6",
            "\1\16\5\uffff\1\22\13\uffff\1\20\5\uffff\1\16\11\uffff\1\6\20\uffff\1\6\36\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 "4027:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );";
        }
    }
    static final String dfa_7s = "\56\uffff";
    static final String dfa_8s = "\2\uffff\53\1\1\uffff";
    static final String dfa_9s = "\1\4\1\uffff\53\74\1\uffff";
    static final String dfa_10s = "\1\u0086\1\uffff\53\u0087\1\uffff";
    static final String dfa_11s = "\1\uffff\1\1\53\uffff\1\2";
    static final String dfa_12s = "\56\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\3\1\20\uffff\17\1\2\uffff\1\1\1\uffff\1\55\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\2\1\6\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\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 DFA53 extends DFA {

        public DFA53(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 53;
            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 "5147: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\3\1\20\uffff\17\1\2\uffff\1\1\1\uffff\1\55\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\3\1\1\uffff\1\1\7\uffff\1\1\27\uffff\1\1",
            ""
    };
    static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);

    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_14;
        }
        public String getDescription() {
            return "5169:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
        }
    }
    static final String dfa_15s = "\74\uffff";
    static final String dfa_16s = "\1\7\63\uffff\5\0\3\uffff";
    static final String dfa_17s = "\1\135\63\uffff\5\0\3\uffff";
    static final String dfa_18s = "\1\uffff\1\1\52\uffff\1\2\16\uffff\1\3";
    static final String dfa_19s = "\64\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\6\1\23\uffff\12\54\1\64\1\65\1\66\1\67\1\70",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\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 DFA58 extends DFA {

        public DFA58(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 58;
            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 "5293:1: rule__TypeExpCS__Alternatives_0 : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA58_52 = input.LA(1);


                        int index58_52 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred183_InternalOCLinEcore()) ) {s = 44;}

                        else if ( (true) ) {s = 59;}


                        input.seek(index58_52);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA58_53 = input.LA(1);


                        int index58_53 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred183_InternalOCLinEcore()) ) {s = 44;}

                        else if ( (true) ) {s = 59;}


                        input.seek(index58_53);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA58_54 = input.LA(1);


                        int index58_54 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred183_InternalOCLinEcore()) ) {s = 44;}

                        else if ( (true) ) {s = 59;}


                        input.seek(index58_54);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA58_55 = input.LA(1);


                        int index58_55 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred183_InternalOCLinEcore()) ) {s = 44;}

                        else if ( (true) ) {s = 59;}


                        input.seek(index58_55);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA58_56 = input.LA(1);


                        int index58_56 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred183_InternalOCLinEcore()) ) {s = 44;}

                        else if ( (true) ) {s = 59;}


                        input.seek(index58_56);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 58, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_21s = "\111\uffff";
    static final String dfa_22s = "\1\4\2\0\106\uffff";
    static final String dfa_23s = "\1\u0086\2\0\106\uffff";
    static final String dfa_24s = "\3\uffff\1\1\104\uffff\1\2";
    static final String dfa_25s = "\1\uffff\1\0\1\1\106\uffff}>";
    static final String[] dfa_26s = {
            "\2\3\1\uffff\2\3\10\uffff\43\3\2\uffff\6\3\1\1\1\2\1\3\20\uffff\17\3\2\uffff\1\3\11\uffff\1\3\1\uffff\2\3\4\uffff\1\3\4\uffff\1\110\1\3\14\uffff\2\3",
            "\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 DFA59 extends DFA {

        public DFA59(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 59;
            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 "5321: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 LA59_1 = input.LA(1);


                        int index59_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred184_InternalOCLinEcore()) ) {s = 3;}

                        else if ( (true) ) {s = 72;}


                        input.seek(index59_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA59_2 = input.LA(1);


                        int index59_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred184_InternalOCLinEcore()) ) {s = 3;}

                        else if ( (true) ) {s = 72;}


                        input.seek(index59_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 59, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_27s = "\1\4\12\uffff\7\0\67\uffff";
    static final String dfa_28s = "\1\u0086\12\uffff\7\0\67\uffff";
    static final String dfa_29s = "\1\uffff\1\1\1\2\1\3\1\4\15\uffff\1\10\1\11\7\uffff\1\12\52\uffff\1\5\1\6\1\7";
    static final String dfa_30s = "\13\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\67\uffff}>";
    static final String[] dfa_31s = {
            "\2\4\1\uffff\2\33\10\uffff\43\33\2\uffff\6\33\2\uffff\1\4\20\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 char[] dfa_27 = DFA.unpackEncodedStringToUnsignedChars(dfa_27s);
    static final char[] dfa_28 = DFA.unpackEncodedStringToUnsignedChars(dfa_28s);
    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
    static final short[] dfa_30 = DFA.unpackEncodedString(dfa_30s);
    static final short[][] dfa_31 = unpackEncodedStringArray(dfa_31s);

    class DFA62 extends DFA {

        public DFA62(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 62;
            this.eot = dfa_21;
            this.eof = dfa_21;
            this.min = dfa_27;
            this.max = dfa_28;
            this.accept = dfa_29;
            this.special = dfa_30;
            this.transition = dfa_31;
        }
        public String getDescription() {
            return "5387: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 LA62_11 = input.LA(1);


                        int index62_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred191_InternalOCLinEcore()) ) {s = 70;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_11);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA62_12 = input.LA(1);


                        int index62_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred192_InternalOCLinEcore()) ) {s = 71;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_12);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA62_13 = input.LA(1);


                        int index62_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred193_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_13);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA62_14 = input.LA(1);


                        int index62_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred193_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_14);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA62_15 = input.LA(1);


                        int index62_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred193_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_15);
                        if ( s>=0 ) return s;
                        break;
                    case 5 :
                        int LA62_16 = input.LA(1);


                        int index62_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred193_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_16);
                        if ( s>=0 ) return s;
                        break;
                    case 6 :
                        int LA62_17 = input.LA(1);


                        int index62_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred193_InternalOCLinEcore()) ) {s = 72;}

                        else if ( (synpred195_InternalOCLinEcore()) ) {s = 19;}


                        input.seek(index62_17);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 62, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_32s = {
            "\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\3\1\20\uffff\17\1\2\uffff\1\1\1\uffff\1\55\7\uffff\1\1\1\uffff\2\1\4\uffff\1\1\4\uffff\2\1\14\uffff\2\1",
            "",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            "\1\1\1\uffff\21\1\21\uffff\1\1\1\uffff\1\55\1\uffff\1\1\2\uffff\1\1\7\uffff\1\1\3\uffff\1\1\23\uffff\1\1",
            ""
    };
    static final short[][] dfa_32 = unpackEncodedStringArray(dfa_32s);

    class DFA68 extends DFA {

        public DFA68(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 68;
            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_32;
        }
        public String getDescription() {
            return "5545:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
        }
    }
    static final String dfa_33s = "\1\5\53\64\2\uffff";
    static final String dfa_34s = "\1\73\53\u0082\2\uffff";
    static final String dfa_35s = "\54\uffff\1\2\1\1";
    static final String[] dfa_36s = {
            "\1\54\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\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "\1\54\55\uffff\1\55\4\uffff\1\54\32\uffff\1\54",
            "",
            ""
    };
    static final char[] dfa_33 = DFA.unpackEncodedStringToUnsignedChars(dfa_33s);
    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
    static final short[][] dfa_36 = unpackEncodedStringArray(dfa_36s);

    class DFA123 extends DFA {

        public DFA123(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 123;
            this.eot = dfa_7;
            this.eof = dfa_7;
            this.min = dfa_33;
            this.max = dfa_34;
            this.accept = dfa_35;
            this.special = dfa_12;
            this.transition = dfa_36;
        }
        public String getDescription() {
            return "10194: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[]{0x0FCFFFFFFFFE0180L});
        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[]{0x0FDFFFFFFFFE0180L,0x0000000400000000L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x7FCFFFFFFFFE03B0L,0x018434013FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x7FDFFFFFFFFE03B0L,0x018434013FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0FCFFFFFFFFE0180L,0x0000000400000000L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0040000000000000L});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0FDFFFFFFFFE01A0L,0x0000001100000000L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0FCFFFFFFFFE01A0L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000A00000000L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000002L,0x0000000800000000L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0ACFFFFFFFFE0180L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0ACFFFFFFFFE0182L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000400001040000L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0010000000000000L,0x0000001400000020L});
        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[]{0x7FCFFFFFFFFE01B0L,0x010434013FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000020L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x000F082024000000L,0xFC00000000000000L,0x0000000000000003L});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x000F082024000002L,0xFC00000000000000L,0x0000000000000003L});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x08C0000082000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x08C0000082000002L});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000020000800000L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0010000000000000L,0x0000001500000004L});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0420000000000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x09C0000000100000L,0x0000002000000000L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x09C0000000100002L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
        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,0x0000000100000000L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0BCFFFFFFFFE0180L,0x0000002000000000L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0BCFFFFFFFFE0182L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0010000000000000L,0x0000001000000020L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x1000000000000010L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x08C0000000000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x08C0000000000002L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0010000000000000L,0x0000000000000000L,0x0000000000000004L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0010000000000000L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000401001000000L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0FCFFFFFFFFE0180L,0x0000000100000004L});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0FCFFFFFFFFE0180L,0x0000000200000000L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0010800000000000L,0x0000001400000000L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0003002004000000L,0xD400000000000000L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0003002004000002L,0xD400000000000000L});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x08C0018000080000L,0x0000002000000000L});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x08C0018000080002L});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x08C0024008A20000L,0x0000002000000000L});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x08C0024008A20002L});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000001400000000L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0002002000000000L,0x9000000000000000L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0002002000000002L,0x9000000000000000L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x020FFFFFFFFE0180L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0010000000000000L,0x0000005400000020L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x000F282004400000L,0xF400000000000000L,0x000000000000001BL});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x000F282004400002L,0xF400000000000000L,0x000000000000001BL});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x08C0000282000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x08C0000282000002L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0010000000000000L,0x0000000800000000L});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000220000L});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0010000010000000L,0x0000001500000004L});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000100000000L,0x0000002000000000L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x08C0000000000000L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0FCFFFFFFFFE01A0L,0x0000001000000000L});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0FCFFFFFFFFE01A0L,0x0000002000000000L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0FCFFFFFFFFE01A2L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000000L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000002L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000004L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x01043401BFFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000002L,0x0000008000000000L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0FCFFFFFFFFE0180L,0x000000003FFF8000L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x018434253FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x018434053FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x018434013FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000000L,0x0000020800000000L});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000180L});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x018434213FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000000L,0x0000002800000000L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000020L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x4000000000000000L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0000100000000000L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x4000000000000030L,0x0000300000000000L,0x0000000000000060L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0xD000000000000000L,0x0000000000007FFFL});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x3000000000000000L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0000801100000000L,0x0000000000000080L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0000800000000000L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x7FCFFFFFFFFE01B0L,0x018434073FFF8000L,0x0000000000000060L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0010000000000000L,0x0000000800000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0001000800000000L});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000000L,0x0002000400000000L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0008000000000000L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000000L,0x0050000000000000L});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000002L,0x0040000000000000L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000000L,0x0002000800000000L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x0000000500000020L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0100000000000000L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x4000000000000010L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x4000000000000010L,0x0000000080000001L});
        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000000L,0x0001000040000000L,0x0000000000000200L});
        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000000L,0x0000800800000000L});
        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000010000000L});
        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000000L,0x0200000000000000L});
        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000000002L,0x0200000000000000L});
    }


}