package com.irtsaintexupery.xtext.pseim.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import com.irtsaintexupery.xtext.pseim.services.PatternGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("all")
public class InternalPatternParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'pattern'", "'('", "','", "')'", "'{'", "'}'", "'component'", "'['", "']'", "'--{'", "'}->'", "'.'", "'unspec'", "'in'", "'out'", "'inout'", "'Transpose'", "'Identity'", "'First'", "'Rotate'", "'ShiftC'", "'ShiftP'", "'FlattenC'", "'ForkC'", "'ForkP'", "'JoinC'", "'JoinP'", "'Last'"
    };
    public static final int RULE_STRING=6;
    public static final int RULE_SL_COMMENT=8;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__37=37;
    public static final int T__16=16;
    public static final int T__38=38;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__11=11;
    public static final int T__33=33;
    public static final int T__12=12;
    public static final int T__34=34;
    public static final int T__13=13;
    public static final int T__35=35;
    public static final int T__14=14;
    public static final int T__36=36;
    public static final int EOF=-1;
    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_ID=4;
    public static final int RULE_WS=9;
    public static final int RULE_ANY_OTHER=10;
    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 RULE_INT=5;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int RULE_ML_COMMENT=7;
    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;

    // delegates
    // delegators


        public InternalPatternParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalPatternParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

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



     	private PatternGrammarAccess grammarAccess;

        public InternalPatternParser(TokenStream input, PatternGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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




    // $ANTLR start "entryRulePattern"
    // InternalPattern.g:65:1: entryRulePattern returns [EObject current=null] : iv_rulePattern= rulePattern EOF ;
    public final EObject entryRulePattern() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePattern = null;


        try {
            // InternalPattern.g:65:48: (iv_rulePattern= rulePattern EOF )
            // InternalPattern.g:66:2: iv_rulePattern= rulePattern EOF
            {
             newCompositeNode(grammarAccess.getPatternRule()); 
            pushFollow(FOLLOW_1);
            iv_rulePattern=rulePattern();

            state._fsp--;

             current =iv_rulePattern; 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "rulePattern"
    // InternalPattern.g:72:1: rulePattern returns [EObject current=null] : (otherlv_0= 'pattern' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )? otherlv_6= ')' (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )? ) ;
    public final EObject rulePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_10=null;
        EObject lv_cardinalityElements_3_0 = null;

        EObject lv_cardinalityElements_5_0 = null;

        EObject lv_modelElements_8_0 = null;

        EObject lv_modelElements_9_0 = null;



        	enterRule();

        try {
            // InternalPattern.g:78:2: ( (otherlv_0= 'pattern' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )? otherlv_6= ')' (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )? ) )
            // InternalPattern.g:79:2: (otherlv_0= 'pattern' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )? otherlv_6= ')' (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )? )
            {
            // InternalPattern.g:79:2: (otherlv_0= 'pattern' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )? otherlv_6= ')' (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )? )
            // InternalPattern.g:80:3: otherlv_0= 'pattern' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )? otherlv_6= ')' (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )?
            {
            otherlv_0=(Token)match(input,11,FOLLOW_3); 

            			newLeafNode(otherlv_0, grammarAccess.getPatternAccess().getPatternKeyword_0());
            		
            // InternalPattern.g:84:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalPattern.g:85:4: (lv_name_1_0= RULE_ID )
            {
            // InternalPattern.g:85:4: (lv_name_1_0= RULE_ID )
            // InternalPattern.g:86:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_4); 

            					newLeafNode(lv_name_1_0, grammarAccess.getPatternAccess().getNameIDTerminalRuleCall_1_0());
            				

            					if (current==null) {
            						current = createModelElement(grammarAccess.getPatternRule());
            					}
            					setWithLastConsumed(
            						current,
            						"name",
            						lv_name_1_0,
            						"org.eclipse.xtext.common.Terminals.ID");
            				

            }


            }

            otherlv_2=(Token)match(input,12,FOLLOW_5); 

            			newLeafNode(otherlv_2, grammarAccess.getPatternAccess().getLeftParenthesisKeyword_2());
            		
            // InternalPattern.g:106:3: ( ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )* )?
            int alt2=2;
            int LA2_0 = input.LA(1);

            if ( (LA2_0==RULE_ID) ) {
                alt2=1;
            }
            switch (alt2) {
                case 1 :
                    // InternalPattern.g:107:4: ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) ) (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )*
                    {
                    // InternalPattern.g:107:4: ( (lv_cardinalityElements_3_0= ruleCardinalityElement ) )
                    // InternalPattern.g:108:5: (lv_cardinalityElements_3_0= ruleCardinalityElement )
                    {
                    // InternalPattern.g:108:5: (lv_cardinalityElements_3_0= ruleCardinalityElement )
                    // InternalPattern.g:109:6: lv_cardinalityElements_3_0= ruleCardinalityElement
                    {

                    						newCompositeNode(grammarAccess.getPatternAccess().getCardinalityElementsCardinalityElementParserRuleCall_3_0_0());
                    					
                    pushFollow(FOLLOW_6);
                    lv_cardinalityElements_3_0=ruleCardinalityElement();

                    state._fsp--;


                    						if (current==null) {
                    							current = createModelElementForParent(grammarAccess.getPatternRule());
                    						}
                    						add(
                    							current,
                    							"cardinalityElements",
                    							lv_cardinalityElements_3_0,
                    							"com.irtsaintexupery.xtext.pseim.Pattern.CardinalityElement");
                    						afterParserOrEnumRuleCall();
                    					

                    }


                    }

                    // InternalPattern.g:126:4: (otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) ) )*
                    loop1:
                    do {
                        int alt1=2;
                        int LA1_0 = input.LA(1);

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


                        switch (alt1) {
                    	case 1 :
                    	    // InternalPattern.g:127:5: otherlv_4= ',' ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) )
                    	    {
                    	    otherlv_4=(Token)match(input,13,FOLLOW_3); 

                    	    					newLeafNode(otherlv_4, grammarAccess.getPatternAccess().getCommaKeyword_3_1_0());
                    	    				
                    	    // InternalPattern.g:131:5: ( (lv_cardinalityElements_5_0= ruleCardinalityElement ) )
                    	    // InternalPattern.g:132:6: (lv_cardinalityElements_5_0= ruleCardinalityElement )
                    	    {
                    	    // InternalPattern.g:132:6: (lv_cardinalityElements_5_0= ruleCardinalityElement )
                    	    // InternalPattern.g:133:7: lv_cardinalityElements_5_0= ruleCardinalityElement
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternAccess().getCardinalityElementsCardinalityElementParserRuleCall_3_1_1_0());
                    	    						
                    	    pushFollow(FOLLOW_6);
                    	    lv_cardinalityElements_5_0=ruleCardinalityElement();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"cardinalityElements",
                    	    								lv_cardinalityElements_5_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.CardinalityElement");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_6=(Token)match(input,14,FOLLOW_7); 

            			newLeafNode(otherlv_6, grammarAccess.getPatternAccess().getRightParenthesisKeyword_4());
            		
            // InternalPattern.g:156:3: (otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}' )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==15) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalPattern.g:157:4: otherlv_7= '{' ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )* otherlv_10= '}'
                    {
                    otherlv_7=(Token)match(input,15,FOLLOW_8); 

                    				newLeafNode(otherlv_7, grammarAccess.getPatternAccess().getLeftCurlyBracketKeyword_5_0());
                    			
                    // InternalPattern.g:161:4: ( ( (lv_modelElements_8_0= rulePatternComponent ) ) | ( (lv_modelElements_9_0= rulePatternLink ) ) )*
                    loop3:
                    do {
                        int alt3=3;
                        int LA3_0 = input.LA(1);

                        if ( (LA3_0==17) ) {
                            alt3=1;
                        }
                        else if ( (LA3_0==RULE_ID) ) {
                            alt3=2;
                        }


                        switch (alt3) {
                    	case 1 :
                    	    // InternalPattern.g:162:5: ( (lv_modelElements_8_0= rulePatternComponent ) )
                    	    {
                    	    // InternalPattern.g:162:5: ( (lv_modelElements_8_0= rulePatternComponent ) )
                    	    // InternalPattern.g:163:6: (lv_modelElements_8_0= rulePatternComponent )
                    	    {
                    	    // InternalPattern.g:163:6: (lv_modelElements_8_0= rulePatternComponent )
                    	    // InternalPattern.g:164:7: lv_modelElements_8_0= rulePatternComponent
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternAccess().getModelElementsPatternComponentParserRuleCall_5_1_0_0());
                    	    						
                    	    pushFollow(FOLLOW_8);
                    	    lv_modelElements_8_0=rulePatternComponent();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"modelElements",
                    	    								lv_modelElements_8_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.PatternComponent");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalPattern.g:182:5: ( (lv_modelElements_9_0= rulePatternLink ) )
                    	    {
                    	    // InternalPattern.g:182:5: ( (lv_modelElements_9_0= rulePatternLink ) )
                    	    // InternalPattern.g:183:6: (lv_modelElements_9_0= rulePatternLink )
                    	    {
                    	    // InternalPattern.g:183:6: (lv_modelElements_9_0= rulePatternLink )
                    	    // InternalPattern.g:184:7: lv_modelElements_9_0= rulePatternLink
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternAccess().getModelElementsPatternLinkParserRuleCall_5_1_1_0());
                    	    						
                    	    pushFollow(FOLLOW_8);
                    	    lv_modelElements_9_0=rulePatternLink();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"modelElements",
                    	    								lv_modelElements_9_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.PatternLink");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_10=(Token)match(input,16,FOLLOW_2); 

                    				newLeafNode(otherlv_10, grammarAccess.getPatternAccess().getRightCurlyBracketKeyword_5_2());
                    			

                    }
                    break;

            }


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "entryRulePatternComponent"
    // InternalPattern.g:211:1: entryRulePatternComponent returns [EObject current=null] : iv_rulePatternComponent= rulePatternComponent EOF ;
    public final EObject entryRulePatternComponent() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternComponent = null;


        try {
            // InternalPattern.g:211:57: (iv_rulePatternComponent= rulePatternComponent EOF )
            // InternalPattern.g:212:2: iv_rulePatternComponent= rulePatternComponent EOF
            {
             newCompositeNode(grammarAccess.getPatternComponentRule()); 
            pushFollow(FOLLOW_1);
            iv_rulePatternComponent=rulePatternComponent();

            state._fsp--;

             current =iv_rulePatternComponent; 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "rulePatternComponent"
    // InternalPattern.g:218:1: rulePatternComponent returns [EObject current=null] : (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? otherlv_6= '(' ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )? otherlv_10= ')' (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )? ) ;
    public final EObject rulePatternComponent() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token lv_multiplicityValue_3_0=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_14=null;
        EObject lv_content_7_0 = null;

        EObject lv_content_9_0 = null;

        EObject lv_content_12_0 = null;

        EObject lv_content_13_0 = null;



        	enterRule();

        try {
            // InternalPattern.g:224:2: ( (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? otherlv_6= '(' ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )? otherlv_10= ')' (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )? ) )
            // InternalPattern.g:225:2: (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? otherlv_6= '(' ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )? otherlv_10= ')' (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )? )
            {
            // InternalPattern.g:225:2: (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? otherlv_6= '(' ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )? otherlv_10= ')' (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )? )
            // InternalPattern.g:226:3: otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? otherlv_6= '(' ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )? otherlv_10= ')' (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )?
            {
            otherlv_0=(Token)match(input,17,FOLLOW_3); 

            			newLeafNode(otherlv_0, grammarAccess.getPatternComponentAccess().getComponentKeyword_0());
            		
            // InternalPattern.g:230:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalPattern.g:231:4: (lv_name_1_0= RULE_ID )
            {
            // InternalPattern.g:231:4: (lv_name_1_0= RULE_ID )
            // InternalPattern.g:232:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_9); 

            					newLeafNode(lv_name_1_0, grammarAccess.getPatternComponentAccess().getNameIDTerminalRuleCall_1_0());
            				

            					if (current==null) {
            						current = createModelElement(grammarAccess.getPatternComponentRule());
            					}
            					setWithLastConsumed(
            						current,
            						"name",
            						lv_name_1_0,
            						"org.eclipse.xtext.common.Terminals.ID");
            				

            }


            }

            // InternalPattern.g:248:3: (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )?
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==18) ) {
                alt6=1;
            }
            switch (alt6) {
                case 1 :
                    // InternalPattern.g:249:4: otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']'
                    {
                    otherlv_2=(Token)match(input,18,FOLLOW_10); 

                    				newLeafNode(otherlv_2, grammarAccess.getPatternComponentAccess().getLeftSquareBracketKeyword_2_0());
                    			
                    // InternalPattern.g:253:4: ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )
                    int alt5=2;
                    int LA5_0 = input.LA(1);

                    if ( (LA5_0==RULE_INT) ) {
                        alt5=1;
                    }
                    else if ( (LA5_0==RULE_ID) ) {
                        alt5=2;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 5, 0, input);

                        throw nvae;
                    }
                    switch (alt5) {
                        case 1 :
                            // InternalPattern.g:254:5: ( (lv_multiplicityValue_3_0= RULE_INT ) )
                            {
                            // InternalPattern.g:254:5: ( (lv_multiplicityValue_3_0= RULE_INT ) )
                            // InternalPattern.g:255:6: (lv_multiplicityValue_3_0= RULE_INT )
                            {
                            // InternalPattern.g:255:6: (lv_multiplicityValue_3_0= RULE_INT )
                            // InternalPattern.g:256:7: lv_multiplicityValue_3_0= RULE_INT
                            {
                            lv_multiplicityValue_3_0=(Token)match(input,RULE_INT,FOLLOW_11); 

                            							newLeafNode(lv_multiplicityValue_3_0, grammarAccess.getPatternComponentAccess().getMultiplicityValueINTTerminalRuleCall_2_1_0_0());
                            						

                            							if (current==null) {
                            								current = createModelElement(grammarAccess.getPatternComponentRule());
                            							}
                            							setWithLastConsumed(
                            								current,
                            								"multiplicityValue",
                            								lv_multiplicityValue_3_0,
                            								"org.eclipse.xtext.common.Terminals.INT");
                            						

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalPattern.g:273:5: ( (otherlv_4= RULE_ID ) )
                            {
                            // InternalPattern.g:273:5: ( (otherlv_4= RULE_ID ) )
                            // InternalPattern.g:274:6: (otherlv_4= RULE_ID )
                            {
                            // InternalPattern.g:274:6: (otherlv_4= RULE_ID )
                            // InternalPattern.g:275:7: otherlv_4= RULE_ID
                            {

                            							if (current==null) {
                            								current = createModelElement(grammarAccess.getPatternComponentRule());
                            							}
                            						
                            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_11); 

                            							newLeafNode(otherlv_4, grammarAccess.getPatternComponentAccess().getCardinalityElementCardinalityElementCrossReference_2_1_1_0());
                            						

                            }


                            }


                            }
                            break;

                    }

                    otherlv_5=(Token)match(input,19,FOLLOW_4); 

                    				newLeafNode(otherlv_5, grammarAccess.getPatternComponentAccess().getRightSquareBracketKeyword_2_2());
                    			

                    }
                    break;

            }

            otherlv_6=(Token)match(input,12,FOLLOW_12); 

            			newLeafNode(otherlv_6, grammarAccess.getPatternComponentAccess().getLeftParenthesisKeyword_3());
            		
            // InternalPattern.g:296:3: ( ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )* )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( ((LA8_0>=23 && LA8_0<=26)) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // InternalPattern.g:297:4: ( (lv_content_7_0= rulePatternPort ) ) (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )*
                    {
                    // InternalPattern.g:297:4: ( (lv_content_7_0= rulePatternPort ) )
                    // InternalPattern.g:298:5: (lv_content_7_0= rulePatternPort )
                    {
                    // InternalPattern.g:298:5: (lv_content_7_0= rulePatternPort )
                    // InternalPattern.g:299:6: lv_content_7_0= rulePatternPort
                    {

                    						newCompositeNode(grammarAccess.getPatternComponentAccess().getContentPatternPortParserRuleCall_4_0_0());
                    					
                    pushFollow(FOLLOW_6);
                    lv_content_7_0=rulePatternPort();

                    state._fsp--;


                    						if (current==null) {
                    							current = createModelElementForParent(grammarAccess.getPatternComponentRule());
                    						}
                    						add(
                    							current,
                    							"content",
                    							lv_content_7_0,
                    							"com.irtsaintexupery.xtext.pseim.Pattern.PatternPort");
                    						afterParserOrEnumRuleCall();
                    					

                    }


                    }

                    // InternalPattern.g:316:4: (otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) ) )*
                    loop7:
                    do {
                        int alt7=2;
                        int LA7_0 = input.LA(1);

                        if ( (LA7_0==13) ) {
                            alt7=1;
                        }


                        switch (alt7) {
                    	case 1 :
                    	    // InternalPattern.g:317:5: otherlv_8= ',' ( (lv_content_9_0= rulePatternPort ) )
                    	    {
                    	    otherlv_8=(Token)match(input,13,FOLLOW_13); 

                    	    					newLeafNode(otherlv_8, grammarAccess.getPatternComponentAccess().getCommaKeyword_4_1_0());
                    	    				
                    	    // InternalPattern.g:321:5: ( (lv_content_9_0= rulePatternPort ) )
                    	    // InternalPattern.g:322:6: (lv_content_9_0= rulePatternPort )
                    	    {
                    	    // InternalPattern.g:322:6: (lv_content_9_0= rulePatternPort )
                    	    // InternalPattern.g:323:7: lv_content_9_0= rulePatternPort
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternComponentAccess().getContentPatternPortParserRuleCall_4_1_1_0());
                    	    						
                    	    pushFollow(FOLLOW_6);
                    	    lv_content_9_0=rulePatternPort();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternComponentRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"content",
                    	    								lv_content_9_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.PatternPort");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_10=(Token)match(input,14,FOLLOW_7); 

            			newLeafNode(otherlv_10, grammarAccess.getPatternComponentAccess().getRightParenthesisKeyword_5());
            		
            // InternalPattern.g:346:3: (otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}' )?
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==15) ) {
                alt10=1;
            }
            switch (alt10) {
                case 1 :
                    // InternalPattern.g:347:4: otherlv_11= '{' ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )* otherlv_14= '}'
                    {
                    otherlv_11=(Token)match(input,15,FOLLOW_8); 

                    				newLeafNode(otherlv_11, grammarAccess.getPatternComponentAccess().getLeftCurlyBracketKeyword_6_0());
                    			
                    // InternalPattern.g:351:4: ( ( (lv_content_12_0= rulePatternComponent ) ) | ( (lv_content_13_0= rulePatternLink ) ) )*
                    loop9:
                    do {
                        int alt9=3;
                        int LA9_0 = input.LA(1);

                        if ( (LA9_0==17) ) {
                            alt9=1;
                        }
                        else if ( (LA9_0==RULE_ID) ) {
                            alt9=2;
                        }


                        switch (alt9) {
                    	case 1 :
                    	    // InternalPattern.g:352:5: ( (lv_content_12_0= rulePatternComponent ) )
                    	    {
                    	    // InternalPattern.g:352:5: ( (lv_content_12_0= rulePatternComponent ) )
                    	    // InternalPattern.g:353:6: (lv_content_12_0= rulePatternComponent )
                    	    {
                    	    // InternalPattern.g:353:6: (lv_content_12_0= rulePatternComponent )
                    	    // InternalPattern.g:354:7: lv_content_12_0= rulePatternComponent
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternComponentAccess().getContentPatternComponentParserRuleCall_6_1_0_0());
                    	    						
                    	    pushFollow(FOLLOW_8);
                    	    lv_content_12_0=rulePatternComponent();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternComponentRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"content",
                    	    								lv_content_12_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.PatternComponent");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalPattern.g:372:5: ( (lv_content_13_0= rulePatternLink ) )
                    	    {
                    	    // InternalPattern.g:372:5: ( (lv_content_13_0= rulePatternLink ) )
                    	    // InternalPattern.g:373:6: (lv_content_13_0= rulePatternLink )
                    	    {
                    	    // InternalPattern.g:373:6: (lv_content_13_0= rulePatternLink )
                    	    // InternalPattern.g:374:7: lv_content_13_0= rulePatternLink
                    	    {

                    	    							newCompositeNode(grammarAccess.getPatternComponentAccess().getContentPatternLinkParserRuleCall_6_1_1_0());
                    	    						
                    	    pushFollow(FOLLOW_8);
                    	    lv_content_13_0=rulePatternLink();

                    	    state._fsp--;


                    	    							if (current==null) {
                    	    								current = createModelElementForParent(grammarAccess.getPatternComponentRule());
                    	    							}
                    	    							add(
                    	    								current,
                    	    								"content",
                    	    								lv_content_13_0,
                    	    								"com.irtsaintexupery.xtext.pseim.Pattern.PatternLink");
                    	    							afterParserOrEnumRuleCall();
                    	    						

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_14=(Token)match(input,16,FOLLOW_2); 

                    				newLeafNode(otherlv_14, grammarAccess.getPatternComponentAccess().getRightCurlyBracketKeyword_6_2());
                    			

                    }
                    break;

            }


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "entryRulePatternPort"
    // InternalPattern.g:401:1: entryRulePatternPort returns [EObject current=null] : iv_rulePatternPort= rulePatternPort EOF ;
    public final EObject entryRulePatternPort() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternPort = null;


        try {
            // InternalPattern.g:401:52: (iv_rulePatternPort= rulePatternPort EOF )
            // InternalPattern.g:402:2: iv_rulePatternPort= rulePatternPort EOF
            {
             newCompositeNode(grammarAccess.getPatternPortRule()); 
            pushFollow(FOLLOW_1);
            iv_rulePatternPort=rulePatternPort();

            state._fsp--;

             current =iv_rulePatternPort; 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "rulePatternPort"
    // InternalPattern.g:408:1: rulePatternPort returns [EObject current=null] : ( ( (lv_dir_0_0= rulePatternPortDirection ) ) ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? ) ;
    public final EObject rulePatternPort() throws RecognitionException {
        EObject current = null;

        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token lv_multiplicityValue_3_0=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Enumerator lv_dir_0_0 = null;



        	enterRule();

        try {
            // InternalPattern.g:414:2: ( ( ( (lv_dir_0_0= rulePatternPortDirection ) ) ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? ) )
            // InternalPattern.g:415:2: ( ( (lv_dir_0_0= rulePatternPortDirection ) ) ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? )
            {
            // InternalPattern.g:415:2: ( ( (lv_dir_0_0= rulePatternPortDirection ) ) ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )? )
            // InternalPattern.g:416:3: ( (lv_dir_0_0= rulePatternPortDirection ) ) ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )?
            {
            // InternalPattern.g:416:3: ( (lv_dir_0_0= rulePatternPortDirection ) )
            // InternalPattern.g:417:4: (lv_dir_0_0= rulePatternPortDirection )
            {
            // InternalPattern.g:417:4: (lv_dir_0_0= rulePatternPortDirection )
            // InternalPattern.g:418:5: lv_dir_0_0= rulePatternPortDirection
            {

            					newCompositeNode(grammarAccess.getPatternPortAccess().getDirPatternPortDirectionEnumRuleCall_0_0());
            				
            pushFollow(FOLLOW_3);
            lv_dir_0_0=rulePatternPortDirection();

            state._fsp--;


            					if (current==null) {
            						current = createModelElementForParent(grammarAccess.getPatternPortRule());
            					}
            					set(
            						current,
            						"dir",
            						lv_dir_0_0,
            						"com.irtsaintexupery.xtext.pseim.Pattern.PatternPortDirection");
            					afterParserOrEnumRuleCall();
            				

            }


            }

            // InternalPattern.g:435:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalPattern.g:436:4: (lv_name_1_0= RULE_ID )
            {
            // InternalPattern.g:436:4: (lv_name_1_0= RULE_ID )
            // InternalPattern.g:437:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_14); 

            					newLeafNode(lv_name_1_0, grammarAccess.getPatternPortAccess().getNameIDTerminalRuleCall_1_0());
            				

            					if (current==null) {
            						current = createModelElement(grammarAccess.getPatternPortRule());
            					}
            					setWithLastConsumed(
            						current,
            						"name",
            						lv_name_1_0,
            						"org.eclipse.xtext.common.Terminals.ID");
            				

            }


            }

            // InternalPattern.g:453:3: (otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']' )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( (LA12_0==18) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // InternalPattern.g:454:4: otherlv_2= '[' ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) ) otherlv_5= ']'
                    {
                    otherlv_2=(Token)match(input,18,FOLLOW_10); 

                    				newLeafNode(otherlv_2, grammarAccess.getPatternPortAccess().getLeftSquareBracketKeyword_2_0());
                    			
                    // InternalPattern.g:458:4: ( ( (lv_multiplicityValue_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )
                    int alt11=2;
                    int LA11_0 = input.LA(1);

                    if ( (LA11_0==RULE_INT) ) {
                        alt11=1;
                    }
                    else if ( (LA11_0==RULE_ID) ) {
                        alt11=2;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 11, 0, input);

                        throw nvae;
                    }
                    switch (alt11) {
                        case 1 :
                            // InternalPattern.g:459:5: ( (lv_multiplicityValue_3_0= RULE_INT ) )
                            {
                            // InternalPattern.g:459:5: ( (lv_multiplicityValue_3_0= RULE_INT ) )
                            // InternalPattern.g:460:6: (lv_multiplicityValue_3_0= RULE_INT )
                            {
                            // InternalPattern.g:460:6: (lv_multiplicityValue_3_0= RULE_INT )
                            // InternalPattern.g:461:7: lv_multiplicityValue_3_0= RULE_INT
                            {
                            lv_multiplicityValue_3_0=(Token)match(input,RULE_INT,FOLLOW_11); 

                            							newLeafNode(lv_multiplicityValue_3_0, grammarAccess.getPatternPortAccess().getMultiplicityValueINTTerminalRuleCall_2_1_0_0());
                            						

                            							if (current==null) {
                            								current = createModelElement(grammarAccess.getPatternPortRule());
                            							}
                            							setWithLastConsumed(
                            								current,
                            								"multiplicityValue",
                            								lv_multiplicityValue_3_0,
                            								"org.eclipse.xtext.common.Terminals.INT");
                            						

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalPattern.g:478:5: ( (otherlv_4= RULE_ID ) )
                            {
                            // InternalPattern.g:478:5: ( (otherlv_4= RULE_ID ) )
                            // InternalPattern.g:479:6: (otherlv_4= RULE_ID )
                            {
                            // InternalPattern.g:479:6: (otherlv_4= RULE_ID )
                            // InternalPattern.g:480:7: otherlv_4= RULE_ID
                            {

                            							if (current==null) {
                            								current = createModelElement(grammarAccess.getPatternPortRule());
                            							}
                            						
                            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_11); 

                            							newLeafNode(otherlv_4, grammarAccess.getPatternPortAccess().getCardinalityElementCardinalityElementCrossReference_2_1_1_0());
                            						

                            }


                            }


                            }
                            break;

                    }

                    otherlv_5=(Token)match(input,19,FOLLOW_2); 

                    				newLeafNode(otherlv_5, grammarAccess.getPatternPortAccess().getRightSquareBracketKeyword_2_2());
                    			

                    }
                    break;

            }


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "entryRuleCardinalityElement"
    // InternalPattern.g:501:1: entryRuleCardinalityElement returns [EObject current=null] : iv_ruleCardinalityElement= ruleCardinalityElement EOF ;
    public final EObject entryRuleCardinalityElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCardinalityElement = null;


        try {
            // InternalPattern.g:501:59: (iv_ruleCardinalityElement= ruleCardinalityElement EOF )
            // InternalPattern.g:502:2: iv_ruleCardinalityElement= ruleCardinalityElement EOF
            {
             newCompositeNode(grammarAccess.getCardinalityElementRule()); 
            pushFollow(FOLLOW_1);
            iv_ruleCardinalityElement=ruleCardinalityElement();

            state._fsp--;

             current =iv_ruleCardinalityElement; 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "ruleCardinalityElement"
    // InternalPattern.g:508:1: ruleCardinalityElement returns [EObject current=null] : ( (lv_name_0_0= RULE_ID ) ) ;
    public final EObject ruleCardinalityElement() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalPattern.g:514:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalPattern.g:515:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalPattern.g:515:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalPattern.g:516:3: (lv_name_0_0= RULE_ID )
            {
            // InternalPattern.g:516:3: (lv_name_0_0= RULE_ID )
            // InternalPattern.g:517:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FOLLOW_2); 

            				newLeafNode(lv_name_0_0, grammarAccess.getCardinalityElementAccess().getNameIDTerminalRuleCall_0());
            			

            				if (current==null) {
            					current = createModelElement(grammarAccess.getCardinalityElementRule());
            				}
            				setWithLastConsumed(
            					current,
            					"name",
            					lv_name_0_0,
            					"org.eclipse.xtext.common.Terminals.ID");
            			

            }


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "entryRulePatternLink"
    // InternalPattern.g:536:1: entryRulePatternLink returns [EObject current=null] : iv_rulePatternLink= rulePatternLink EOF ;
    public final EObject entryRulePatternLink() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternLink = null;


        try {
            // InternalPattern.g:536:52: (iv_rulePatternLink= rulePatternLink EOF )
            // InternalPattern.g:537:2: iv_rulePatternLink= rulePatternLink EOF
            {
             newCompositeNode(grammarAccess.getPatternLinkRule()); 
            pushFollow(FOLLOW_1);
            iv_rulePatternLink=rulePatternLink();

            state._fsp--;

             current =iv_rulePatternLink; 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "rulePatternLink"
    // InternalPattern.g:543:1: rulePatternLink returns [EObject current=null] : ( ( ( ruleQualifiedID ) ) otherlv_1= '--{' ( (lv_linkType_2_0= ruleLinkType ) ) otherlv_3= '}->' ( ( ruleQualifiedID ) ) ) ;
    public final EObject rulePatternLink() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Enumerator lv_linkType_2_0 = null;



        	enterRule();

        try {
            // InternalPattern.g:549:2: ( ( ( ( ruleQualifiedID ) ) otherlv_1= '--{' ( (lv_linkType_2_0= ruleLinkType ) ) otherlv_3= '}->' ( ( ruleQualifiedID ) ) ) )
            // InternalPattern.g:550:2: ( ( ( ruleQualifiedID ) ) otherlv_1= '--{' ( (lv_linkType_2_0= ruleLinkType ) ) otherlv_3= '}->' ( ( ruleQualifiedID ) ) )
            {
            // InternalPattern.g:550:2: ( ( ( ruleQualifiedID ) ) otherlv_1= '--{' ( (lv_linkType_2_0= ruleLinkType ) ) otherlv_3= '}->' ( ( ruleQualifiedID ) ) )
            // InternalPattern.g:551:3: ( ( ruleQualifiedID ) ) otherlv_1= '--{' ( (lv_linkType_2_0= ruleLinkType ) ) otherlv_3= '}->' ( ( ruleQualifiedID ) )
            {
            // InternalPattern.g:551:3: ( ( ruleQualifiedID ) )
            // InternalPattern.g:552:4: ( ruleQualifiedID )
            {
            // InternalPattern.g:552:4: ( ruleQualifiedID )
            // InternalPattern.g:553:5: ruleQualifiedID
            {

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

            					newCompositeNode(grammarAccess.getPatternLinkAccess().getSrcPatternPortCrossReference_0_0());
            				
            pushFollow(FOLLOW_15);
            ruleQualifiedID();

            state._fsp--;


            					afterParserOrEnumRuleCall();
            				

            }


            }

            otherlv_1=(Token)match(input,20,FOLLOW_16); 

            			newLeafNode(otherlv_1, grammarAccess.getPatternLinkAccess().getHyphenMinusHyphenMinusLeftCurlyBracketKeyword_1());
            		
            // InternalPattern.g:571:3: ( (lv_linkType_2_0= ruleLinkType ) )
            // InternalPattern.g:572:4: (lv_linkType_2_0= ruleLinkType )
            {
            // InternalPattern.g:572:4: (lv_linkType_2_0= ruleLinkType )
            // InternalPattern.g:573:5: lv_linkType_2_0= ruleLinkType
            {

            					newCompositeNode(grammarAccess.getPatternLinkAccess().getLinkTypeLinkTypeEnumRuleCall_2_0());
            				
            pushFollow(FOLLOW_17);
            lv_linkType_2_0=ruleLinkType();

            state._fsp--;


            					if (current==null) {
            						current = createModelElementForParent(grammarAccess.getPatternLinkRule());
            					}
            					set(
            						current,
            						"linkType",
            						lv_linkType_2_0,
            						"com.irtsaintexupery.xtext.pseim.Pattern.LinkType");
            					afterParserOrEnumRuleCall();
            				

            }


            }

            otherlv_3=(Token)match(input,21,FOLLOW_18); 

            			newLeafNode(otherlv_3, grammarAccess.getPatternLinkAccess().getRightCurlyBracketHyphenMinusGreaterThanSignKeyword_3());
            		
            // InternalPattern.g:594:3: ( ( ruleQualifiedID ) )
            // InternalPattern.g:595:4: ( ruleQualifiedID )
            {
            // InternalPattern.g:595:4: ( ruleQualifiedID )
            // InternalPattern.g:596:5: ruleQualifiedID
            {

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

            					newCompositeNode(grammarAccess.getPatternLinkAccess().getDstPatternPortCrossReference_4_0());
            				
            pushFollow(FOLLOW_2);
            ruleQualifiedID();

            state._fsp--;


            					afterParserOrEnumRuleCall();
            				

            }


            }


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "entryRuleQualifiedID"
    // InternalPattern.g:614:1: entryRuleQualifiedID returns [String current=null] : iv_ruleQualifiedID= ruleQualifiedID EOF ;
    public final String entryRuleQualifiedID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedID = null;


        try {
            // InternalPattern.g:614:51: (iv_ruleQualifiedID= ruleQualifiedID EOF )
            // InternalPattern.g:615:2: iv_ruleQualifiedID= ruleQualifiedID EOF
            {
             newCompositeNode(grammarAccess.getQualifiedIDRule()); 
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedID=ruleQualifiedID();

            state._fsp--;

             current =iv_ruleQualifiedID.getText(); 
            match(input,EOF,FOLLOW_2); 

            }

        }

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


    // $ANTLR start "ruleQualifiedID"
    // InternalPattern.g:621:1: ruleQualifiedID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;
        Token kw=null;
        Token this_ID_2=null;


        	enterRule();

        try {
            // InternalPattern.g:627:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
            // InternalPattern.g:628:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            {
            // InternalPattern.g:628:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
            // InternalPattern.g:629:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_19); 

            			current.merge(this_ID_0);
            		

            			newLeafNode(this_ID_0, grammarAccess.getQualifiedIDAccess().getIDTerminalRuleCall_0());
            		
            // InternalPattern.g:636:3: (kw= '.' this_ID_2= RULE_ID )*
            loop13:
            do {
                int alt13=2;
                int LA13_0 = input.LA(1);

                if ( (LA13_0==22) ) {
                    alt13=1;
                }


                switch (alt13) {
            	case 1 :
            	    // InternalPattern.g:637:4: kw= '.' this_ID_2= RULE_ID
            	    {
            	    kw=(Token)match(input,22,FOLLOW_3); 

            	    				current.merge(kw);
            	    				newLeafNode(kw, grammarAccess.getQualifiedIDAccess().getFullStopKeyword_1_0());
            	    			
            	    this_ID_2=(Token)match(input,RULE_ID,FOLLOW_19); 

            	    				current.merge(this_ID_2);
            	    			

            	    				newLeafNode(this_ID_2, grammarAccess.getQualifiedIDAccess().getIDTerminalRuleCall_1_1());
            	    			

            	    }
            	    break;

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


            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "rulePatternPortDirection"
    // InternalPattern.g:654:1: rulePatternPortDirection returns [Enumerator current=null] : ( (enumLiteral_0= 'unspec' ) | (enumLiteral_1= 'in' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'inout' ) ) ;
    public final Enumerator rulePatternPortDirection() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalPattern.g:660:2: ( ( (enumLiteral_0= 'unspec' ) | (enumLiteral_1= 'in' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'inout' ) ) )
            // InternalPattern.g:661:2: ( (enumLiteral_0= 'unspec' ) | (enumLiteral_1= 'in' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'inout' ) )
            {
            // InternalPattern.g:661:2: ( (enumLiteral_0= 'unspec' ) | (enumLiteral_1= 'in' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'inout' ) )
            int alt14=4;
            switch ( input.LA(1) ) {
            case 23:
                {
                alt14=1;
                }
                break;
            case 24:
                {
                alt14=2;
                }
                break;
            case 25:
                {
                alt14=3;
                }
                break;
            case 26:
                {
                alt14=4;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 14, 0, input);

                throw nvae;
            }

            switch (alt14) {
                case 1 :
                    // InternalPattern.g:662:3: (enumLiteral_0= 'unspec' )
                    {
                    // InternalPattern.g:662:3: (enumLiteral_0= 'unspec' )
                    // InternalPattern.g:663:4: enumLiteral_0= 'unspec'
                    {
                    enumLiteral_0=(Token)match(input,23,FOLLOW_2); 

                    				current = grammarAccess.getPatternPortDirectionAccess().getUNSPECIFIEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_0, grammarAccess.getPatternPortDirectionAccess().getUNSPECIFIEDEnumLiteralDeclaration_0());
                    			

                    }


                    }
                    break;
                case 2 :
                    // InternalPattern.g:670:3: (enumLiteral_1= 'in' )
                    {
                    // InternalPattern.g:670:3: (enumLiteral_1= 'in' )
                    // InternalPattern.g:671:4: enumLiteral_1= 'in'
                    {
                    enumLiteral_1=(Token)match(input,24,FOLLOW_2); 

                    				current = grammarAccess.getPatternPortDirectionAccess().getINEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_1, grammarAccess.getPatternPortDirectionAccess().getINEnumLiteralDeclaration_1());
                    			

                    }


                    }
                    break;
                case 3 :
                    // InternalPattern.g:678:3: (enumLiteral_2= 'out' )
                    {
                    // InternalPattern.g:678:3: (enumLiteral_2= 'out' )
                    // InternalPattern.g:679:4: enumLiteral_2= 'out'
                    {
                    enumLiteral_2=(Token)match(input,25,FOLLOW_2); 

                    				current = grammarAccess.getPatternPortDirectionAccess().getOUTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_2, grammarAccess.getPatternPortDirectionAccess().getOUTEnumLiteralDeclaration_2());
                    			

                    }


                    }
                    break;
                case 4 :
                    // InternalPattern.g:686:3: (enumLiteral_3= 'inout' )
                    {
                    // InternalPattern.g:686:3: (enumLiteral_3= 'inout' )
                    // InternalPattern.g:687:4: enumLiteral_3= 'inout'
                    {
                    enumLiteral_3=(Token)match(input,26,FOLLOW_2); 

                    				current = grammarAccess.getPatternPortDirectionAccess().getINOUTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_3, grammarAccess.getPatternPortDirectionAccess().getINOUTEnumLiteralDeclaration_3());
                    			

                    }


                    }
                    break;

            }


            }


            	leaveRule();

        }

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


    // $ANTLR start "ruleLinkType"
    // InternalPattern.g:697:1: ruleLinkType returns [Enumerator current=null] : ( (enumLiteral_0= 'Transpose' ) | (enumLiteral_1= 'Identity' ) | (enumLiteral_2= 'First' ) | (enumLiteral_3= 'Rotate' ) | (enumLiteral_4= 'ShiftC' ) | (enumLiteral_5= 'ShiftP' ) | (enumLiteral_6= 'FlattenC' ) | (enumLiteral_7= 'ForkC' ) | (enumLiteral_8= 'ForkP' ) | (enumLiteral_9= 'JoinC' ) | (enumLiteral_10= 'JoinP' ) | (enumLiteral_11= 'Last' ) ) ;
    public final Enumerator ruleLinkType() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;
        Token enumLiteral_6=null;
        Token enumLiteral_7=null;
        Token enumLiteral_8=null;
        Token enumLiteral_9=null;
        Token enumLiteral_10=null;
        Token enumLiteral_11=null;


        	enterRule();

        try {
            // InternalPattern.g:703:2: ( ( (enumLiteral_0= 'Transpose' ) | (enumLiteral_1= 'Identity' ) | (enumLiteral_2= 'First' ) | (enumLiteral_3= 'Rotate' ) | (enumLiteral_4= 'ShiftC' ) | (enumLiteral_5= 'ShiftP' ) | (enumLiteral_6= 'FlattenC' ) | (enumLiteral_7= 'ForkC' ) | (enumLiteral_8= 'ForkP' ) | (enumLiteral_9= 'JoinC' ) | (enumLiteral_10= 'JoinP' ) | (enumLiteral_11= 'Last' ) ) )
            // InternalPattern.g:704:2: ( (enumLiteral_0= 'Transpose' ) | (enumLiteral_1= 'Identity' ) | (enumLiteral_2= 'First' ) | (enumLiteral_3= 'Rotate' ) | (enumLiteral_4= 'ShiftC' ) | (enumLiteral_5= 'ShiftP' ) | (enumLiteral_6= 'FlattenC' ) | (enumLiteral_7= 'ForkC' ) | (enumLiteral_8= 'ForkP' ) | (enumLiteral_9= 'JoinC' ) | (enumLiteral_10= 'JoinP' ) | (enumLiteral_11= 'Last' ) )
            {
            // InternalPattern.g:704:2: ( (enumLiteral_0= 'Transpose' ) | (enumLiteral_1= 'Identity' ) | (enumLiteral_2= 'First' ) | (enumLiteral_3= 'Rotate' ) | (enumLiteral_4= 'ShiftC' ) | (enumLiteral_5= 'ShiftP' ) | (enumLiteral_6= 'FlattenC' ) | (enumLiteral_7= 'ForkC' ) | (enumLiteral_8= 'ForkP' ) | (enumLiteral_9= 'JoinC' ) | (enumLiteral_10= 'JoinP' ) | (enumLiteral_11= 'Last' ) )
            int alt15=12;
            switch ( input.LA(1) ) {
            case 27:
                {
                alt15=1;
                }
                break;
            case 28:
                {
                alt15=2;
                }
                break;
            case 29:
                {
                alt15=3;
                }
                break;
            case 30:
                {
                alt15=4;
                }
                break;
            case 31:
                {
                alt15=5;
                }
                break;
            case 32:
                {
                alt15=6;
                }
                break;
            case 33:
                {
                alt15=7;
                }
                break;
            case 34:
                {
                alt15=8;
                }
                break;
            case 35:
                {
                alt15=9;
                }
                break;
            case 36:
                {
                alt15=10;
                }
                break;
            case 37:
                {
                alt15=11;
                }
                break;
            case 38:
                {
                alt15=12;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 15, 0, input);

                throw nvae;
            }

            switch (alt15) {
                case 1 :
                    // InternalPattern.g:705:3: (enumLiteral_0= 'Transpose' )
                    {
                    // InternalPattern.g:705:3: (enumLiteral_0= 'Transpose' )
                    // InternalPattern.g:706:4: enumLiteral_0= 'Transpose'
                    {
                    enumLiteral_0=(Token)match(input,27,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getTRANSPOSEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_0, grammarAccess.getLinkTypeAccess().getTRANSPOSEEnumLiteralDeclaration_0());
                    			

                    }


                    }
                    break;
                case 2 :
                    // InternalPattern.g:713:3: (enumLiteral_1= 'Identity' )
                    {
                    // InternalPattern.g:713:3: (enumLiteral_1= 'Identity' )
                    // InternalPattern.g:714:4: enumLiteral_1= 'Identity'
                    {
                    enumLiteral_1=(Token)match(input,28,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getIDENTITYEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_1, grammarAccess.getLinkTypeAccess().getIDENTITYEnumLiteralDeclaration_1());
                    			

                    }


                    }
                    break;
                case 3 :
                    // InternalPattern.g:721:3: (enumLiteral_2= 'First' )
                    {
                    // InternalPattern.g:721:3: (enumLiteral_2= 'First' )
                    // InternalPattern.g:722:4: enumLiteral_2= 'First'
                    {
                    enumLiteral_2=(Token)match(input,29,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getFIRSTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_2, grammarAccess.getLinkTypeAccess().getFIRSTEnumLiteralDeclaration_2());
                    			

                    }


                    }
                    break;
                case 4 :
                    // InternalPattern.g:729:3: (enumLiteral_3= 'Rotate' )
                    {
                    // InternalPattern.g:729:3: (enumLiteral_3= 'Rotate' )
                    // InternalPattern.g:730:4: enumLiteral_3= 'Rotate'
                    {
                    enumLiteral_3=(Token)match(input,30,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getROTATEEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_3, grammarAccess.getLinkTypeAccess().getROTATEEnumLiteralDeclaration_3());
                    			

                    }


                    }
                    break;
                case 5 :
                    // InternalPattern.g:737:3: (enumLiteral_4= 'ShiftC' )
                    {
                    // InternalPattern.g:737:3: (enumLiteral_4= 'ShiftC' )
                    // InternalPattern.g:738:4: enumLiteral_4= 'ShiftC'
                    {
                    enumLiteral_4=(Token)match(input,31,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getSHIFTCEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_4, grammarAccess.getLinkTypeAccess().getSHIFTCEnumLiteralDeclaration_4());
                    			

                    }


                    }
                    break;
                case 6 :
                    // InternalPattern.g:745:3: (enumLiteral_5= 'ShiftP' )
                    {
                    // InternalPattern.g:745:3: (enumLiteral_5= 'ShiftP' )
                    // InternalPattern.g:746:4: enumLiteral_5= 'ShiftP'
                    {
                    enumLiteral_5=(Token)match(input,32,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getSHIFTPEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_5, grammarAccess.getLinkTypeAccess().getSHIFTPEnumLiteralDeclaration_5());
                    			

                    }


                    }
                    break;
                case 7 :
                    // InternalPattern.g:753:3: (enumLiteral_6= 'FlattenC' )
                    {
                    // InternalPattern.g:753:3: (enumLiteral_6= 'FlattenC' )
                    // InternalPattern.g:754:4: enumLiteral_6= 'FlattenC'
                    {
                    enumLiteral_6=(Token)match(input,33,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getFLATTENCEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_6, grammarAccess.getLinkTypeAccess().getFLATTENCEnumLiteralDeclaration_6());
                    			

                    }


                    }
                    break;
                case 8 :
                    // InternalPattern.g:761:3: (enumLiteral_7= 'ForkC' )
                    {
                    // InternalPattern.g:761:3: (enumLiteral_7= 'ForkC' )
                    // InternalPattern.g:762:4: enumLiteral_7= 'ForkC'
                    {
                    enumLiteral_7=(Token)match(input,34,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getFORKCEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_7, grammarAccess.getLinkTypeAccess().getFORKCEnumLiteralDeclaration_7());
                    			

                    }


                    }
                    break;
                case 9 :
                    // InternalPattern.g:769:3: (enumLiteral_8= 'ForkP' )
                    {
                    // InternalPattern.g:769:3: (enumLiteral_8= 'ForkP' )
                    // InternalPattern.g:770:4: enumLiteral_8= 'ForkP'
                    {
                    enumLiteral_8=(Token)match(input,35,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getFORKPEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_8, grammarAccess.getLinkTypeAccess().getFORKPEnumLiteralDeclaration_8());
                    			

                    }


                    }
                    break;
                case 10 :
                    // InternalPattern.g:777:3: (enumLiteral_9= 'JoinC' )
                    {
                    // InternalPattern.g:777:3: (enumLiteral_9= 'JoinC' )
                    // InternalPattern.g:778:4: enumLiteral_9= 'JoinC'
                    {
                    enumLiteral_9=(Token)match(input,36,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getJOINCEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_9, grammarAccess.getLinkTypeAccess().getJOINCEnumLiteralDeclaration_9());
                    			

                    }


                    }
                    break;
                case 11 :
                    // InternalPattern.g:785:3: (enumLiteral_10= 'JoinP' )
                    {
                    // InternalPattern.g:785:3: (enumLiteral_10= 'JoinP' )
                    // InternalPattern.g:786:4: enumLiteral_10= 'JoinP'
                    {
                    enumLiteral_10=(Token)match(input,37,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getJOINPEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_10, grammarAccess.getLinkTypeAccess().getJOINPEnumLiteralDeclaration_10());
                    			

                    }


                    }
                    break;
                case 12 :
                    // InternalPattern.g:793:3: (enumLiteral_11= 'Last' )
                    {
                    // InternalPattern.g:793:3: (enumLiteral_11= 'Last' )
                    // InternalPattern.g:794:4: enumLiteral_11= 'Last'
                    {
                    enumLiteral_11=(Token)match(input,38,FOLLOW_2); 

                    				current = grammarAccess.getLinkTypeAccess().getLASTEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
                    				newLeafNode(enumLiteral_11, grammarAccess.getLinkTypeAccess().getLASTEnumLiteralDeclaration_11());
                    			

                    }


                    }
                    break;

            }


            }


            	leaveRule();

        }

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

    // Delegated rules


 

    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[]{0x0000000000000010L});
    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000004010L});
    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000006000L});
    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000008002L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000030010L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000041000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000000030L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000007804000L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000007800000L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000100000L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000007FF8000000L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000200000L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000020010L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000400002L});

}